在数据处理的世界里,excel 是最常见的文件格式之一。虽然现在的标准是 .xlsx(基于 xml 的较新格式),但在很多传统行业、旧系统导出数据或历史文档中,我们仍然会频繁遇到 .xls 格式(excel 97-2003 工作簿)。
对于 python 初学者来说,处理这种“古老”的格式往往会遇到一些坑(比如现代库不支持)。本教程将手把手教你如何使用 python 系统化、专业地读写 .xls 文件。
1. 准备工作:环境与依赖库
在开始写代码之前,我们需要理解 python 处理 excel 的生态系统。
- pandas: 这是 python 数据分析的神器。我们将主要通过它来操作数据,因为它封装了底层的复杂操作,非常适合初学者。
- xlrd: 这是一个专门用于读取
.xls文件的引擎。 - xlwt: 这是一个专门用于写入
.xls文件的引擎。
注意:目前流行的 openpyxl 库仅支持 .xlsx 格式,不支持 .xls。因此,为了处理旧格式,我们必须安装 xlrd 和 xlwt。
安装步骤
打开你的终端(terminal)或命令提示符(cmd),运行以下命令安装所需的库:
pip install pandas xlrd xlwt
安装完成后,我们就可以开始编写 python 代码了。
2. 读取 .xls 文件
读取 .xls 文件最简单、最强大的方法是使用 pandas 的 read_excel 函数。
基础读取代码
假设你有一个名为 old_data.xls 的文件,内容如下:
| name | age | city |
|---|---|---|
| alice | 25 | new york |
| bob | 30 | london |
以下是读取该文件的代码:
import pandas as pd
# 1. 定义文件路径
file_path = 'old_data.xls'
try:
# 2. 读取 excel 文件
# pandas 会自动调用 xlrd 引擎来处理 .xls 文件
df = pd.read_excel(file_path)
# 3. 打印前几行数据以检查
print("文件读取成功!前 5 行数据如下:")
print(df.head())
except filenotfounderror:
print(f"错误:找不到文件 {file_path}")
except exception as e:
print(f"读取过程中发生错误:{e}")
进阶读取技巧
在实际工作中,excel 文件往往比较复杂。以下是一些常用的参数配置:
- 指定 sheet(工作表): 如果文件有多个 sheet,你可以通过名字或索引指定。
- 指定表头: 有时候第一行不是表头。
# 读取名为 "sheet2" 的工作表,且指定第 2 行(索引为1)作为表头 df_sheet2 = pd.read_excel(file_path, sheet_name='sheet2', header=1) # 如果文件中没有表头,设置 header=none df_no_header = pd.read_excel(file_path, header=none)
3. 写入 .xls 文件
将数据保存为 .xls 格式,我们需要使用 pandas 的 to_excel 方法。pandas 会在后台调用 xlwt 库来完成这个任务。
基础写入代码
我们将创建一个简单的数据集,并将其保存为 output.xls。
import pandas as pd
# 1. 创建示例数据(字典格式)
data = {
'员工id': [101, 102, 103],
'姓名': ['张三', '李四', '王五'],
'入职年份': [2018, 2020, 2023]
}
# 2. 转换为 dataframe
df_output = pd.dataframe(data)
# 3. 定义输出文件名
output_file = 'report_2024.xls'
try:
# 4. 写入文件
# index=false 表示不把左侧的行索引号(0, 1, 2...)写入 excel
df_output.to_excel(output_file, index=false)
print(f"成功将数据写入 {output_file}")
except exception as e:
print(f"写入失败:{e}")
写入多个 sheet
如果你需要在一个 .xls 文件中写入多个工作表,需要使用 excelwriter 对象:
with pd.excelwriter('multi_sheet_report.xls', engine='xlwt') as writer:
df_output.to_excel(writer, sheet_name='员工名单', index=false)
df_output.to_excel(writer, sheet_name='备份数据', index=false)
print("多 sheet 文件写入完成。")
4. 常见陷阱与解决方案 (common pitfalls)
作为初学者,处理 .xls 时最容易遇到以下问题:
1. 行数限制 (the 65,536 row limit)
问题: 当你试图写入超过 65,536 行数据到 .xls 文件时,程序会报错。
原因: 这是 excel 97-2003 格式的物理限制。
解决:
- 首选: 将文件保存为
.xlsx格式(支持约 100 万行)。 - 次选: 如果必须用
.xls,需要将数据拆分到多个 sheet 或多个文件中。
2. 库的混淆 (xlrd vs openpyxl)
问题: 报错 xlrd.biffh.xlrderror: excel xlsx file; not supported.
原因: 你试图用 xlrd 读取 .xlsx 文件,或者你的 xlrd 版本过新(2.0+ 版本移除了对 .xlsx 的支持,仅支持 .xls)。
解决:
- 读取
.xls: 确保安装了xlrd。 - 读取
.xlsx: 确保安装了openpyxl。
3. 编码问题
问题: 读取中文内容的 .xls 有时会出现乱码(较少见,但存在)。
解决: 虽然 pandas 处理得很好,但如果遇到,可以在 read_excel 中尝试添加 encoding='utf-8' 或 encoding='gbk' 参数(虽然新版 pandas 已移除此参数,通常需检查源文件是否损坏)。
5. 总结与建议
处理旧版 excel 文件是数据分析师的基本功。以下是本次教程的核心要点回顾:
- 读取: 使用
pandas.read_excel('file.xls'),底层依赖xlrd。 - 写入: 使用
df.to_excel('file.xls'),底层依赖xlwt。 - 注意: 牢记
.xls格式有 65536 行的行数限制。
给初学者的最终建议:除非工作环境强制要求使用 .xls,否则在生成新文件时,强烈建议使用现代的 .xlsx 格式。它体积更小、更安全、且支持更多的数据量。
到此这篇关于python新手指南之如何读写旧版excel(.xls)格式文件的文章就介绍到这了,更多相关python读写旧版excel文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论