前言
虽然我的编程母语是 javascript
,但是经常会使用python
来处理各种格式的数据文件(如.txt、.json、.xlsx .csv、.sav等等)。当然处理得最多的还是excel文件。为啥用python?好用啊!有各种开箱即用的工具库,如 pandas
和 openpyxl
这俩个好哥们都是我的码中常客。
pandas 和 openpyxl 哪家强?
openpyxl 和 pandas 各有优势,选择需结合具体场景(如数据规模、操作类型、性能需求)。下面我们先从核心功能、性能、适用场景展等几个不同的维度做个对比。
一、openpyxl 与 pandas 核心对比
维度 | openpyxl | pandas |
---|---|---|
核心定位 | excel 文件底层操作(格式、样式、公式、图表) | 数据分析与批量处理(清洗、聚合、透视表) |
数据处理能力 | 基础读写,无内置分析函数 | 强大(筛选、聚合、时间序列分析等) |
性能表现 | 小文件读取更快;增量模式(read_only=true)节省内存 | 大数据分析快(向量化计算);全加载内存,大文件易崩溃 |
格式支持 | 仅支持 .xlsx/.xlsm 等新格式 | 支持 excel、csv、json 等 |
样式/图表 | 精细控制(字体、颜色、图表、条件格式) | 需依赖 openpyxl 引擎辅助实现 |
性能测试数据(10,000行数据集):
- 数据筛选:pandas 快 10 倍以上(0.02秒 vs 0.25秒)
- 数据聚合:pandas 快 50 倍(0.01秒 vs 0.5秒)
- 大文件读取:openpyxl 增量模式内存占用低 60%
二、其他 excel 处理工具推荐
除 openpyxl 和 pandas 外,以下工具可以满足其他不同场景的需求:
工具 | 核心优势 | 适用场景 |
---|---|---|
xlwings | 双向交互 excel vba,实时更新数据 | 自动化报表(python 计算 → excel 动态展示) |
xlsxwriter | 专注写入,支持高级格式(图表、条件格式、加密) | 生成复杂格式报告(如带动态图表的仪表盘) |
xlrd/xlwt | 兼容旧版 .xls 格式 (xlrd 读取,xlwt 写入) | 处理 excel 2003 及更早版本文件 |
tablib | 轻量级多格式转换(excel/csv/json 互转) | 快速导出数据,无需复杂分析 |
三、如何选择工具
可根据下图决策:
四、混合使用策略(推荐场景)
结合两者优势可让效率最大化:
# 示例:openpyxl读取 → pandas处理 → openpyxl美化输出 from openpyxl import load_workbook import pandas as pd # 1. openpyxl增量读取大文件 wb = load_workbook("large_file.xlsx", read_only=true) data = [row for row in wb.active.values][1:] # 跳过标题 wb.close() # 2. pandas处理数据 df = pd.dataframe(data, columns=["name", "age"]) df_filtered = df[df["age"] > 30].groupby("name").mean() # 3. openpyxl输出带样式 with pd.excelwriter("output.xlsx", engine="openpyxl") as writer: df_filtered.to_excel(writer, sheet_name="summary") workbook = writer.book worksheet = writer.sheets["summary"] # 设置标题样式 for cell in worksheet[1]: cell.font = font(bold=true, color="ffffff") cell.fill = patternfill(start_color="366092", fill_type="solid")
方法补充
python操作excel的多种方式pandas+openpyxl+xlrd
pandas
pip install pandas
使用pandas
操作excel文件主要涉及读取(read_excel
)和写入(to_excel
)两个主要操作。
读取excel文件(read_excel
)
pandas
的read_excel
函数用于读取excel文件(.xls
或.xlsx
),并将其内容加载到dataframe
对象中。
语法参数
io
: 文件路径或文件对象。sheet_name
: 指定要读取的工作表名称或索引。可以是字符串、整数、字符串列表或none。如果是none,则返回字典,其中包含所有工作表。header
: 指定作为列名的行,默认为0(第一行)。如果文件没有列标题,可以设置为none。names
: 用于结果的列名的列表,如果文件不包含列标题行,应该明确指定此参数。index_col
: 用作行索引的列编号或列名,可以是整数、字符串、整数列表、字符串列表或false(默认)。usecols
: 返回列的列号或列名列表。dtype
: 数据或字典,用于强制指定某些列的数据类型。engine
: 用于读取excel文件的引擎。none
将尝试使用io
的扩展名来选择引擎。如果安装了xlrd
,则.xls
文件将使用它;否则,将使用openpyxl
或odfpy
(对于.ods
文件)。
案例:
import pandas as pd # 读取excel文件 df = pd.read_excel('example.xlsx', sheet_name='sheet1', header=0, index_col=none, usecols=none, dtype=none) # 显示前几行数据 print(df.head()) # 如果文件没有列标题 df_no_header = pd.read_excel('example_no_header.xlsx', header=none, names=['column1', 'column2', 'column3']) print(df_no_header.head()) # 读取多个工作表 xls = pd.excelfile('example.xlsx') df1 = pd.read_excel(xls, 'sheet1') df2 = pd.read_excel(xls, 'sheet2') # 或者 dfs = pd.read_excel(xls, sheet_name=none) # 返回一个字典,键为工作表名,值为dataframe
进阶案例:读取特定单元格范围
虽然read_excel
没有直接读取特定单元格范围的参数,但你可以通过usecols
和行切片来实现类似的效果。
# 假设我们只想读取'a'列和'c'列的前两行 df = pd.read_excel('example.xlsx', usecols=['a', 'c']).head(2)
写入excel文件(to_excel
)
dataframe
的to_excel
方法用于将dataframe
写入excel文件。
语法参数
excel_writer
: 文件路径或excelwriter对象。sheet_name
: 字符串,默认为'sheet1'。columns
: 要写入的列名列表。header
: 是否写入列名作为excel文件的第一行,默认为true。index
: 是否将行索引写入excel文件,默认为true。startrow
和startcol
: 左上角单元格的行号和列号,用于开始写入,默认为0。engine
: 用于写入excel文件的引擎,默认为none
(将尝试使用openpyxl
或xlsxwriter
)。
案例
# 创建一个简单的dataframe df = pd.dataframe({ 'a': [1, 2, 3, 4], 'b': ['foo', 'bar', 'baz', 'qux'], 'c': [1.0, 2.1, 3.2, 4.3] }) # 写入excel文件 df.to_excel('output.xlsx', sheet_name='sheet1', index=false, header=true) # 如果要写入多个工作表 with pd.excelwriter('output_multiple_sheets.xlsx') as writer: df.to_excel(writer, sheet_name='sheet1', index=false) df.to_excel(writer, sheet_name='sheet2', index=false, startrow=10) # 从第11行开始写入
进阶案例:写入带有样式的excel
为了写入带有样式的excel文件,你需要使用excelwriter
和xlsxwriter
或openpyxl
引擎(取决于你的需求)。
# 使用xlsxwriter引擎写入带有样式的excel with pd.excelwriter('styled_output.xlsx', engine='xlsxwriter') as writer: df.to_excel(writer, sheet_name='sheet1', index=false) workbook = writer.book worksheet = writer.sheets['sheet1'] # 创建一个格式对象 format = workbook.add_format({'bold': true, 'font_color': 'red'}) # 应用格式到特定单元格 worksheet.write('a1', 'styled cell', format)
注意:xlsxwriter
引擎在写入时不支持直接修改已存在的dataframe
内容(如通过dataframe.style
),它主要用于在写入时添加额外的样式或格式。如果你需要复杂的样式处理,可能需要结合使用pandas
和openpyxl
(或xlsxwriter
)的高级功能。
openpyxl
openpyxl
是一个用于读写 excel 2010 xlsx/xlsm/xltx/xltm 文件的 python 库。它提供了丰富的接口来操作 excel 文件,包括读取、修改和写入数据,以及设置样式等。下面我将详细解释如何使用 openpyxl
操作 excel,并给出案例代码和进阶案例。
安装 openpyxl
首先,确保你已经安装了 openpyxl
。如果还没有安装,可以通过 pip 安装:
pip install openpyxl
基本操作
1.加载工作簿
使用 openpyxl.load_workbook()
函数加载一个现有的 excel 文件。
from openpyxl import load_workbook wb = load_workbook(filename='example.xlsx')
2.激活工作表
通过工作簿对象获取工作表。你可以通过工作表名称或索引来访问特定的工作表。
# 通过名称 ws = wb['sheet1'] # 或者通过索引(索引从0开始) ws = wb.worksheets[0] # 也可以使用 active 属性获取当前活动的工作表 ws = wb.active
3.读取数据
你可以通过单元格的坐标来读取数据。
# 读取单元格的值 cell_value = ws['a1'].value print(cell_value) # 遍历行 for row in ws.iter_rows(values_only=true): print(row) # 遍历列 for col in ws.iter_cols(values_only=true): for value in col: print(value)
4.写入数据
你可以直接给单元格赋值来写入数据。
# 写入数据 ws['b2'] = 'hello, openpyxl!' # 保存修改 wb.save('modified_example.xlsx')
语法参数详解
由于 openpyxl
的功能非常广泛,这里只列举一些常用函数和方法的参数。
load_workbook(filename, read_only=false, data_only=false, keep_vba=true, ...)
filename
: excel 文件路径。read_only
: 是否以只读模式打开文件。data_only
: 是否只读取单元格的值,忽略公式(默认为 false)。keep_vba
: 是否保留 vba 内容(默认为 true)。
worksheet.iter_rows(min_row=none, max_row=none, min_col=none, max_col=none, values_only=false, ...)
min_row
,max_row
,min_col
,max_col
: 指定迭代的行或列的范围。values_only
: 是否只迭代单元格的值(默认为 false,迭代单元格对象)。
worksheet.iter_cols(...)
与iter_rows
类似,但用于列迭代。
案例代码
读取并修改 excel
from openpyxl import load_workbook # 加载工作簿 wb = load_workbook('example.xlsx') # 激活工作表 ws = wb.active # 读取单元格数据 print(ws['a1'].value) # 修改单元格数据 ws['b2'] = 'new value' # 保存修改后的工作簿 wb.save('modified_example.xlsx')
进阶案例
设置样式
from openpyxl import workbook from openpyxl.styles import font, color, alignment, border, side # 创建一个新的工作簿和工作表 wb = workbook() ws = wb.active # 创建一个字体对象 font = font(name='calibri', size=11, bold=true, italic=false, vertalign=none, underline='none', strike=false, color='ff0000') # 创建一个对齐对象 alignment = alignment(horizontal='general', vertical='bottom', text_rotation=0, wrap_text=false, shrink_to_fit=false, indent=0) # 创建一个边框对象 thin = side(border_style="thin", color="000000") border = border(top=thin, left=thin, right=thin, bottom=thin) # 应用样式到单元格 ws['a1'].font = font ws['a1'].alignment = alignment ws['a1'].border = border ws['a1'] = 'styled cell' # 保存工作簿 wb.save('styled_workbook.xlsx')
在进阶案例中,我们展示了如何创建字体、对齐和边框样式,并将它们应用到单元格上。openpyxl
提供了丰富的样式选项,可以满足大多数 excel 样式设置的需求。
xlrd
xlrd
是一个用于读取 excel 文件(主要是 .xls
和 .xlsx
格式,尽管对 .xlsx
的支持可能不如 openpyxl
全面)的 python 库。然而,需要注意的是,从版本 2.0.0 开始,xlrd
仅支持 .xls
格式的文件,不再支持 .xlsx
。对于 .xlsx
文件,推荐使用 openpyxl
或 pandas
(后者底层可以调用 openpyxl
)。
安装 xlrd
首先,确保你已经安装了 xlrd
。如果还没有安装,可以通过 pip 安装:
pip install xlrd==1.2.0 # 最好选择一个支持.xlsx的旧版本
基本操作
加载工作簿
使用 xlrd.open_workbook()
函数加载 excel 文件。
import xlrd # 加载工作簿 workbook = xlrd.open_workbook('example.xls')
访问工作表
通过索引或名称访问工作表。
# 通过索引访问(索引从0开始) sheet = workbook.sheet_by_index(0) # 或者通过名称访问 sheet = workbook.sheet_by_name('sheet1')
读取数据
使用行号(从0开始)和列号(也从0开始)或单元格名称(如 'a1')来读取数据。
# 通过行号和列号读取 cell_value = sheet.cell_value(0, 0) # 读取第一行第一列的数据 print(cell_value) # 或者使用 cell 方法(返回单元格对象,然后可以调用 value 属性) cell = sheet.cell(0, 0) print(cell.value) # 通过单元格名称读取(需要安装xlutils或类似库来转换a1表示法) # 注意:xlrd本身不直接支持a1表示法,这里仅作为说明 # 通常,你会通过计算行号和列号来访问单元格
语法参数详解
由于 xlrd
的 api 相对简单,这里主要关注 open_workbook()
和 sheet_by_...()
方法的参数。
xlrd.open_workbook(filename=none, ...)
filename
: excel 文件路径。- 其他参数(如
on_demand
、formatting_info
等)在较新版本的xlrd
中可能不再支持或用途有限,特别是针对.xlsx
文件的处理。
workbook.sheet_by_index(sheetx)
和workbook.sheet_by_name(sheet_name)
sheetx
: 工作表的索引(整数)。sheet_name
: 工作表的名称(字符串)。
案例代码
读取 excel 文件中的数据
import xlrd # 加载工作簿 workbook = xlrd.open_workbook('example.xls') # 通过名称访问工作表 sheet = workbook.sheet_by_name('sheet1') # 读取并打印第一行和第一列的数据 print(sheet.cell_value(0, 0)) # 遍历所有行和列 for row_idx in range(sheet.nrows): for col_idx in range(sheet.ncols): print(sheet.cell_value(row_idx, col_idx), end='\t') print() # 换行
总结建议
- 选 openpyxl:精确控制格式/公式/图表(如财务报表模板)。
- 选 pandas:需数据清洗、统计或跨格式分析(如销售数据透视)。
- 选其他工具:
- 交互式报表 → xlwings
- 旧版文件 → xlrd/xlwt
- 高级写入 → xlsxwriter
- 混合方案:大文件或“分析+美化”场景的首选。
最终决策应结合数据规模、操作类型及输出需求。灵活组合工具可最大化效率 。
以上就是python中处理excel数据的方法对比(pandas和openpyxl)的详细内容,更多关于python处理excel数据的资料请关注代码网其它相关文章!
发表评论