pin_drop当前位置:知识文库 ❯ 图文
Python openpyxl单元格读取详解:多种读取方式与实战教程
openpyxl是Python中处理Excel文件的强大库,单元格读取是从Excel文件中获取数据的核心操作。openpyxl支持通过单元格坐标(如A1)、行列索引、行迭代、列迭代等多种方式读取数据。理解不同读取方式的适用场景和性能差异,可以高效地从Excel中提取所需信息。
一、概述
在数据处理工作中,我们经常需要从Excel文件中读取数据。openpyxl提供了多种灵活的读取方式,适用于不同的业务场景。无论是读取单个单元格、遍历整行整列,还是按条件筛选数据,都能找到合适的读取方法。掌握这些读取技巧,可以大大提升Python处理Excel数据的效率。
二、语法总览
openpyxl提供了四种主要的单元格读取语法,下面逐一介绍:
代码示例
# 按坐标读取
ws['A1'].value
# 按行列索引读取
ws.cell(row=1, column=1).value
# 行迭代
for row in ws.iter_rows():
for cell in row:
cell.value
# 列迭代
for col in ws.iter_cols():
for cell in col:
cell.value三、参数说明
cell()方法参数
iter_rows()方法参数
iter_cols()方法参数
四、返回值说明
-
ws['A1']:返回Cell对象,通过.value属性获取单元格值
-
ws.cell():返回Cell对象,可进一步获取coordinate、row、column等属性
-
iter_rows/iter_cols:返回生成器对象,可通过for循环遍历,配合values_only=True直接返回值
五、代码示例
示例1:基本单元格读取
本示例演示如何使用坐标读取和cell()方法读取单个单元格的值,并获取单元格的各种属性。
代码示例
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
# 写入测试数据
data = [
['姓名', '年龄', '城市'],
['张三', 25, '北京'],
['李四', 30, '上海'],
['王五', 28, '广州']
]
for row in data:
ws.append(row)
# 方式1:坐标读取
print(f"ws['A1'] = {ws['A1'].value}")
print(f"ws['B2'] = {ws['B2'].value}")
# 方式2:cell()方法读取
print(f"cell(1,1) = {ws.cell(row=1, column=1).value}")
print(f"cell(2,2) = {ws.cell(row=2, column=2).value}")
# 读取单元格属性
cell = ws['A1']
print(f"\n单元格坐标: {cell.coordinate}")
print(f"行号: {cell.row}, 列号: {cell.column}")
print(f"数据类型: {type(cell.value)}")输出结果:
代码示例
ws['A1'] = 姓名
ws['B2'] = 25
cell(1,1) = 姓名
cell(2,2) = 25
单元格坐标: A1
行号: 1, 列号: 1
数据类型: <class 'str'>示例2:行迭代读取
使用iter_rows()方法遍历Excel中的所有行数据,演示了values_only参数的差异和范围读取的技巧。
代码示例
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
data = [['编号', '名称', '价格'],
[1, '苹果', 5.5],
[2, '香蕉', 3.2],
[3, '橙子', 4.8]]
for row in data:
ws.append(row)
# 遍历所有行(返回Cell对象)
print("iter_rows():")
for row in ws.iter_rows(min_row=1, max_row=4):
values = [cell.value for cell in row]
print(f" {values}")
# values_only=True只返回值
print("\niter_rows(values_only=True):")
for row in ws.iter_rows(values_only=True):
print(f" {row}")
# 读取指定范围
print("\n只读取数据区域(跳过表头):")
for row in ws.iter_rows(min_row=2, values_only=True):
print(f" {row}")输出结果:
代码示例
iter_rows():
['编号', '名称', '价格']
[1, '苹果', 5.5]
[2, '香蕉', 3.2]
[3, '橙子', 4.8]
iter_rows(values_only=True):
('编号', '名称', '价格')
(1, '苹果', 5.5)
(2, '香蕉', 3.2)
(3, '橙子', 4.8)
只读取数据区域(跳过表头):
(1, '苹果', 5.5)
(2, '香蕉', 3.2)
(3, '橙子', 4.8)示例3:列迭代与条件读取
演示列迭代读取方法,以及如何结合条件判断筛选特定数据。
代码示例
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
data = [['姓名', '部门', '工资'],
['张三', '技术部', 15000],
['李四', '市场部', 12000],
['王五', '技术部', 18000],
['赵六', '财务部', 13000]]
for row in data:
ws.append(row)
# 列迭代
print("iter_cols():")
for col in ws.iter_cols(min_col=1, max_col=3, values_only=True):
print(f" {col}")
# 条件读取:工资大于13000的员工
print("\n工资>13000的员工:")
for row in ws.iter_rows(min_row=2, values_only=True):
if row[2] > 13000:
print(f" {row[0]}: {row[2]}")
# 读取特定列
print("\n只读取姓名和工资:")
for row in ws.iter_rows(min_row=2, min_col=1, max_col=3, values_only=True):
print(f" {row[0]}: {row[2]}")输出结果:
代码示例
iter_cols():
('姓名', '张三', '李四', '王五', '赵六')
('部门', '技术部', '市场部', '技术部', '财务部')
('工资', 15000, 12000, 18000, 13000)
工资>13000的员工:
张三: 15000
王五: 18000
只读取姓名和工资:
张三: 15000
李四: 12000
王五: 18000
赵六: 13000六、实际应用场景
-
数据导入:读取Excel文件的数据到数据库或pandas DataFrame,常用于ETL数据处理流程
-
数据筛选:按条件读取特定行或列的数据,例如筛选出成绩优秀的学生或销售额达标的产品
-
报表汇总:从多个工作表读取数据合并计算,生成综合统计报表
七、注意事项
注意:行列索引从1开始,不是0,这与Python列表不同,初学者容易犯此错误。
注意:values_only=True时返回元组而非列表,性能更好,适合只读取数据的场景。
注意:读取空单元格时返回None,在数据处理时需要注意判断,避免引发TypeError。
八、读取方式对比
九、小结
-
ws['A1']和ws.cell(row, column)是两种基本的单元格读取方式,适用于精确位置读取
-
iter_rows()按行遍历,iter_cols()按列遍历,values_only=True只返回值而不返回Cell对象,性能更好
-
行列索引从1开始,空单元格返回None,处理数据时需要注意判断
-
条件读取通过遍历+判断实现,可以灵活筛选所需数据
十、练习题
练习1
创建一个3x4的数据表,分别使用坐标和cell()方法读取所有单元格的值。
练习2
使用iter_rows()遍历一个5行3列的数据表,分别测试values_only=True和False的差异。
练习3
创建一个学生成绩表,读取所有成绩大于80分的学生信息。
常见问题
为什么行列索引从1开始而不是0?
因为Excel的行号列标本身就是从1开始的(A列是第1列,第1行是行号1),openpyxl遵循Excel的索引规则,与Excel界面保持一致。这与Python列表从0开始不同,使用时需要注意。
iter_rows()和ws.values有什么区别?
iter_rows()返回的是Cell对象(values_only=False时)或值元组(values_only=True时),可以指定行列范围。ws.values等价于iter_rows(values_only=True),但更简洁,返回整个工作表的值。
读取空单元格为什么会返回None?
在Excel中,空单元格没有值,openpyxl用None表示空值。在数据处理时,需要对None进行判断,例如使用if cell.value is not None或if row[2]跳过空值。
读取大文件时如何提高性能?
对于大型Excel文件,建议使用load_workbook(data_only=False, read_only=True)以只读模式打开,配合iter_rows(values_only=True)读取,可以显著减少内存占用并提高读取速度。
本文涉及AI创作
内容由AI创作,请仔细甄别