首页 > 编程语言 >Python之openpyxl模块的学习

Python之openpyxl模块的学习

时间:2023-11-03 17:57:43浏览次数:40  
标签:openpyxl Python 单元格 iter ws 模块 print col row

简介

之前针对Excel的读取都是使用的xlrd模块,但是在一次实践中发现xlrd模块去掉了对xlsx格式的支持,因此改用openpyxl。

以下内容仅包含使用openpyxl读取Excel文档的操作,并且比较浅显,更多内容请参考官方文档

注:一个excel就是一个工作簿(workbook),一个工作簿含有多个工作表 (sheet)

实践

导入openpyxl

import openpyxl

读取Excel文件

wb = openpyxl.load_workbook(filename='')

根据官方文档所述:当需要处理极端大的xlsx文件,但通用的 openpyxl 程序无法处理这么大的负载时,提供了 只读模式 和 只写模式 这两种优化模式可以使我们在(几乎)恒定的内存消耗下读写无限量的数据。

只读模式只需要指定 read_only 参数为 True

wb = openpyxl.load_workbook(filename='', readonly=True)

获取工作表

使用索引获取:ws = wb.worksheets[sheet_idx]

  • 其中 wb.worksheets 返回的是一个openpyxl中工作表对象的list(list of :class:`openpyxl.worksheet.worksheet.Worksheet`

使用sheet名称获取:ws = wb['Sheet1']

**注意:get_sheet_by_name() 方法已经废弃,不再使用。

获取行数与列数

获取行数:ws.max_row

获取列数:ws.max_column

访问单个单元格数据

可以直接通过工作表的键来访问单元格:

# 单元格对象 <ReadOnlyCell 'Sheet1'.A1>
cell = ws['A1']
# 获取单元格的值
data = ws['A1'].value

也可以通过指定 行、列 数来访问:

# 获取 第二行第三列 单元格的值
ws.cell(row=2, column=3).value

# 此方法还有个参数 value=None,默认为None,可以通过指定value的值来修改单元格的数据,但此处是以只读模式读取单元格,不再赘述

访问多个单元格数据

使用切片来访问多个单元格数据

# 访问A1单元格到C2单元格,返回的是tuple(tuple, tuple),其中一个tuple是一行,内层tuple的元素是cell对象
# ((<ReadOnlyCell 'Sheet1'.A1>, <ReadOnlyCell 'Sheet1'.B1>, <ReadOnlyCell 'Sheet1'.C1>), (<ReadOnlyCell 'Sheet1'.A2>, <ReadOnlyCell 'Sheet1'.B2>, <ReadOnlyCell 'Sheet1'.C2>))

print(ws['A1':'C2'])

# 在此基础上获取单元格的值
for row in ws['A1':'C2']:
    for cell in row:
        print(cell.value)

使用切片来访问行和列

# 访问第二行的数据
# (<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>, <Cell 'Sheet1'.D2>)
row2 = ws[2]
print(row2)

# 访问第二行到第三行的数据,
# ((<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>, <Cell 'Sheet1'.D2>), (<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>, <Cell 'Sheet1'.D3>))
row_range = ws[2:3]
print(row_range)

# 访问C列的数据
# (<Cell 'Sheet1'.C1>, <Cell 'Sheet1'.C2>, <Cell 'Sheet1'.C3>)
col_c = ws['C']
print(col_c)

# 访问C列到D列的数据
# ((<Cell 'Sheet1'.C1>, <Cell 'Sheet1'.C2>, <Cell 'Sheet1'.C3>), (<Cell 'Sheet1'.D1>, <Cell 'Sheet1'.D2>, <Cell 'Sheet1'.D3>))
col_range = ws['C': 'D']
print(col_range)

**注意:

  • 这里的切片不同于python切片,此处的[start : end] 会将stop包含在内(在python中不会将stop包含在内)
  • 此处获取列数据的方法调用的是 Worksheet.iter_cols() 方法,而由于性能原因此方法在只读模式下不可用,因此这里获取列数据的方法仅在非只读模式下可用。

获取文件中所有的行和列

使用ws.rows获取文件中所有的行:

# ws.rows 返回一个生成器对象,这个生成器每次生成的值为 此行所有单元格对象组成的tuple对象
# (<ReadOnlyCell 'Sheet1'.A1>, <ReadOnlyCell 'Sheet1'.B1>, <ReadOnlyCell 'Sheet1'.C1>)
# (<ReadOnlyCell 'Sheet1'.A2>, <ReadOnlyCell 'Sheet1'.B2>, <ReadOnlyCell 'Sheet1'.C2>)
# (<ReadOnlyCell 'Sheet1'.A3>, <ReadOnlyCell 'Sheet1'.B3>, <ReadOnlyCell 'Sheet1'.C3>)
for r in ws.rows:
    print(r)

# 如果要取值,可以对每一行数据进行遍历,再使用cell.value取值

使用ws.columns获取文件中所有的列:

# ws.columns与ws.rows相同,也是返回一个生成器对象,其中每次生成的值为 此列所有单元格对象组成的tuple
# **注意:由于性能原因 Worksheet.columns 方法在只读模式下不可用
for col in ws.columns:
    print(col)

使用ws.iter_rows()获取指定行和列:

  • 与ws.rows不同的是,ws.iter_rows()可以指定参数来获取特定的行和列的数据;若不指定参数,则和ws.rows相同
# ws.iter_rows()返回一个生成器对象,每次生成的值为每一行的cell对象组成的tuple
for row in ws.iter_rows():
    print(row)

# 指定参数,values_only默认为False,指定为True则只返回值而不是cell对象
# ws.iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=False)
# 取第一行到第三行 第4列到第6列的数据
for row in ws.iter_rows(min_row=1, max_row=3, min_col=4, max_col=6, values_only=False):
    print(row)

使用ws.iter_cols()获取指定行和列

  • 和ws.columns的区别同上
# ws.iter_cols()返回一个生成器对象,每次生成的值为每一列的cell对象组成的tuple
for col in ws.iter_cols():
    print(col)

# 指定参数,values_only默认为False,指定为True则只返回值而不是cell对象
# iter_cols(self, min_col=None, max_col=None, min_row=None, max_row=None, values_only=False)
# 取第三列到第五列 第1-2行的数据
for col in ws.iter_cols(min_col=3, max_col=5, min_row=None, max_row=2, values_only=False):
    print(col)

**注意:

  • 由于性能原因ws.iter_cols()在只读模式下不可用,若要使用请修改read_only=False
  • 这两种方法的区别在于 ws.iter_rows()是以行的维度返回数据,ws.iter_cols()是以列的维度返回数据

直接获取文件中所有的值

如果只想要工作表中的值,可以使用 Worksheet.values 属性,这样会遍历工作表中所有的行但只返回单元格的值。

相同的,Worksheet.values 也是返回一个生成器对象,其中每次生成的值为 工作表中每一行的值组成的tuple

# row 为每一行的值组成的tuple
for row in ws.values:
    for value in row:
        print(value)

也可以通过 Worksheet.iter_rows 和 Worksheet.iter_cols,指定 values_only 参数来返回单元格值

# 以行的维度 返回第一行到第三行 第4列到第5列的单元格的值
# 每个row就是一个tuple,元素为此行的值
for row in ws.iter_rows(min_row=1, max_row=3, min_col=4, max_col=6, values_only=True):
    print(row)

# 以列的维度 返回第3列到第五列 第1行到第2行的单元格的值
# 每个col就是一个tuple,元素为此列的值
for col in ws.iter_cols(min_col=3, max_col=5, min_row=None, max_row=2, values_only=True):
    print(col)

标签:openpyxl,Python,单元格,iter,ws,模块,print,col,row
From: https://www.cnblogs.com/themoony/p/17808097.html

相关文章

  • python训练阿里云语音合成模型
    训练阿里云多人训练语音合成模型model_link:https://modelscope.cn/models/speech_tts/speech_sambert-hifigan_tts_zh-cn_multisp_pretrain_24k/summary1.获取KANTTS算法训练框架2.配置虚拟环境(conda)需要下载pytorch及其他kantts算法依赖3.数据准备:https://modelsco......
  • Python_web开发基础内容
    网络长连接的HTTP协议,会在响应头有加入这个头部字段:Connection:keep-aliveWebSocket:需要通过网络传输的任何实时更新或连续数据流,则可以使用WebSocketHTTP:不需要很频繁或仅获取一次的数据可以通过简单的HTTP请求查询都是用来跟踪浏览器用户身份的会话方式.cookie......
  • angie njs 模块试用
    angienjs是一个类似lua的模块,提供了基于js进行nginx功能开发的能力(但是目前没有nginxlua模块强大)以下是一个简单试用环境准备基于了以前测试nginxlua模块的基础镜像http.js functionfoo(r){r.log("hellofromfoo()handler");return......
  • Python-运算符
    Python-运算符1.Python运算符的优先级以下表格列出了从最高到最低优先级的所有运算符:如果是同优先级则从左往右依次递减运算符描述**乘方,指数(最高优先级)~+-按位翻转,一元加号和减号(最后两个的方法名为+@和-@)*/%//乘,除,取模和取整除+-......
  • Python 中的 __init__.py 和__all__ 详解(抄袭的joker) 因为写的实在是太好了
    Python中的__init__.py和__all__详解JOKER没意思先生 之前不论是自己写代码还是用别人的代码,都没有注意过这个东西,今天忽然看了一下,网上的教程感觉讲的都不是很清楚,自己又研究了研究,总结一下,如果有不对的地方,大家帮忙指正一下。在Python工程里,当pyth......
  • angie nginx_lua 模块使用
    angie包含了不少社区模块,docker镜像更加方便,都已经安装了,以下是一个测试lua模式的使用因为默认官方构建的是一个动态扩展模块,对于三方lua模块安装不是很方便,我参考了openresty对于luarocks的支持,这样我们自己安装三方lua模块就比较方便的构建支持luarocks的dcoker镜......
  • python 中[1:]、[:-1]和[::-1]
    代码分析:str='abcdefg'print(str[1:])print(str[:-1])print(str[-1:])print(str[::-1])print(str[::-2])print(str[:])-------------------------------------------------------------------------------------------结果bcdefgabcdefggfedcbagecaabcdefg1234567......
  • 爬虫之requests模块
    一、爬虫介绍1、2、二、requests模块1、2、三、携带请求参数1、2、四、url编码和解码1、2、五、携带请求头1、2、六、发送post请求1、2、七、携带cookie1、2、八、响应对象1、2、九、高级用法1、2、......
  • [Python] 基于 flask 构建 Web API 实现参数注入和校验
    在python中,flask包是一个轻量级的WEB框架,常用于快速构建HTTP服务。但它并没有提供参数校验和注入的功能。习惯了java等高级编程语言开发webapi的同学,应该都不想每定义一个api都要写很多代码去做校验和获取请求参数吧,至少我是这样。幸运的是,已经有人提供了参数校验相......
  • 基础环境(python,gpu等)
    anaconda:清华镜像站中anaconda的所有版本的网址:Indexof/anaconda/archive/|清华大学开源软件镜像站|TsinghuaOpenSourceMirrorminianaconda:Indexof/(anaconda.com) wgethttps://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.shbashMiniconda3-......