愿世界对你温柔 發表於 2026-1-7 08:59:35

Python新手指南之如何读写旧版Excel(.xls)格式文件

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 准备工作:环境与依赖库</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">安装步骤</a></li></ul><li><a href="#_label1">2. 读取 .xls 文件</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_1">基础读取代码</a></li><li><a href="#_lab2_1_2">进阶读取技巧</a></li></ul><li><a href="#_label2">3. 写入 .xls 文件</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_3">基础写入代码</a></li><li><a href="#_lab2_2_4">写入多个 Sheet</a></li></ul><li><a href="#_label3">4. 常见陷阱与解决方案 (Common Pitfalls)</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_5">1. 行数限制 (The 65,536 Row Limit)</a></li><li><a href="#_lab2_3_6">2. 库的混淆 (xlrd vs openpyxl)</a></li><li><a href="#_lab2_3_7">3. 编码问题</a></li></ul><li><a href="#_label4">5. 总结与建议</a></li><ul class="second_class_ul"></ul></ul></div><p>在数据处理的世界里,Excel 是最常见的文件格式之一。虽然现在的标准是 <code>.xlsx</code>(基于 XML 的较新格式),但在很多传统行业、旧系统导出数据或历史文档中,我们仍然会频繁遇到 <code>.xls</code> 格式(Excel 97-2003 工作簿)。</p>
<p>对于 Python 初学者来说,处理这种&ldquo;古老&rdquo;的格式往往会遇到一些坑(比如现代库不支持)。本教程将手把手教你如何使用 Python <strong>系统化、专业地</strong>读写 <code>.xls</code> 文件。</p>
<p class="maodian"><a name="_label0"></a></p><h2>1. 准备工作:环境与依赖库</h2>
<p>在开始写代码之前,我们需要理解 Python 处理 Excel 的生态系统。</p>
<ul><li><strong>Pandas</strong>: 这是 Python 数据分析的神器。我们将主要通过它来操作数据,因为它封装了底层的复杂操作,非常适合初学者。</li><li><strong>xlrd</strong>: 这是一个专门用于<strong>读取</strong> <code>.xls</code> 文件的引擎。</li><li><strong>xlwt</strong>: 这是一个专门用于<strong>写入</strong> <code>.xls</code> 文件的引擎。</li></ul>
<p><strong>注意</strong>:目前流行的 <code>openpyxl</code> 库仅支持 <code>.xlsx</code> 格式,不支持 <code>.xls</code>。因此,为了处理旧格式,我们必须安装 <code>xlrd</code> 和 <code>xlwt</code>。</p>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>安装步骤</h3>
<p>打开你的终端(Terminal)或命令提示符(CMD),运行以下命令安装所需的库:</p>
<div class="jb51code"><pre class="brush:bash;">pip install pandas xlrd xlwt
</pre></div>
<p>安装完成后,我们就可以开始编写 Python 代码了。</p>
<p class="maodian"><a name="_label1"></a></p><h2>2. 读取 .xls 文件</h2>
<p>读取 <code>.xls</code> 文件最简单、最强大的方法是使用 Pandas 的 <code>read_excel</code> 函数。</p>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>基础读取代码</h3>
<p>假设你有一个名为 <code>old_data.xls</code> 的文件,内容如下:</p>
<table><thead><tr><th>Name</th><th>Age</th><th>City</th></tr></thead><tbody><tr><td>Alice</td><td>25</td><td>New York</td></tr><tr><td>Bob</td><td>30</td><td>London</td></tr></tbody></table>
<p>以下是读取该文件的代码:</p>
<div class="jb51code"><pre class="brush:py;">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}")
</pre></div>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>进阶读取技巧</h3>
<p>在实际工作中,Excel 文件往往比较复杂。以下是一些常用的参数配置:</p>
<ul><li><strong>指定 Sheet(工作表)</strong>: 如果文件有多个 Sheet,你可以通过名字或索引指定。</li><li><strong>指定表头</strong>: 有时候第一行不是表头。</li></ul>
<div class="jb51code"><pre class="brush:py;"># 读取名为 "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)
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>3. 写入 .xls 文件</h2>
<p>将数据保存为 <code>.xls</code> 格式,我们需要使用 Pandas 的 <code>to_excel</code> 方法。Pandas 会在后台调用 <code>xlwt</code> 库来完成这个任务。</p>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>基础写入代码</h3>
<p>我们将创建一个简单的数据集,并将其保存为 <code>output.xls</code>。</p>
<div class="jb51code"><pre class="brush:py;">import pandas as pd

# 1. 创建示例数据(字典格式)
data = {
    '员工ID': ,
    '姓名': ['张三', '李四', '王五'],
    '入职年份':
}

# 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}")
</pre></div>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>写入多个 Sheet</h3>
<p>如果你需要在一个 <code>.xls</code> 文件中写入多个工作表,需要使用 <code>ExcelWriter</code> 对象:</p>
<div class="jb51code"><pre class="brush:py;">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 文件写入完成。")
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4. 常见陷阱与解决方案 (Common Pitfalls)</h2>
<p>作为初学者,处理 <code>.xls</code> 时最容易遇到以下问题:</p>
<p class="maodian"><a name="_lab2_3_5"></a></p><h3>1. 行数限制 (The 65,536 Row Limit)</h3>
<p><strong>问题</strong>: 当你试图写入超过 65,536 行数据到 <code>.xls</code> 文件时,程序会报错。</p>
<p><strong>原因</strong>: 这是 Excel 97-2003 格式的物理限制。</p>
<p><strong>解决</strong>:</p>
<ul><li><strong>首选</strong>: 将文件保存为 <code>.xlsx</code> 格式(支持约 100 万行)。</li><li><strong>次选</strong>: 如果必须用 <code>.xls</code>,需要将数据拆分到多个 Sheet 或多个文件中。</li></ul>
<p class="maodian"><a name="_lab2_3_6"></a></p><h3>2. 库的混淆 (xlrd vs openpyxl)</h3>
<p><strong>问题</strong>: 报错 <code>xlrd.biffh.XLRDError: Excel xlsx file; not supported</code>.</p>
<p><strong>原因</strong>: 你试图用 <code>xlrd</code> 读取 <code>.xlsx</code> 文件,或者你的 <code>xlrd</code> 版本过新(2.0+ 版本移除了对 <code>.xlsx</code> 的支持,仅支持 <code>.xls</code>)。</p>
<p><strong>解决</strong>:</p>
<ul><li>读取 <code>.xls</code>: 确保安装了 <code>xlrd</code>。</li><li>读取 <code>.xlsx</code>: 确保安装了 <code>openpyxl</code>。</li></ul>
<p class="maodian"><a name="_lab2_3_7"></a></p><h3>3. 编码问题</h3>
<p><strong>问题</strong>: 读取中文内容的 <code>.xls</code> 有时会出现乱码(较少见,但存在)。</p>
<p><strong>解决</strong>: 虽然 Pandas 处理得很好,但如果遇到,可以在 <code>read_excel</code> 中尝试添加 <code>encoding=&#39;utf-8&#39;</code> 或 <code>encoding=&#39;gbk&#39;</code> 参数(虽然新版 Pandas 已移除此参数,通常需检查源文件是否损坏)。</p>
<p class="maodian"><a name="_label4"></a></p><h2>5. 总结与建议</h2>
<p>处理旧版 Excel 文件是数据分析师的基本功。以下是本次教程的核心要点回顾:</p>
<ul><li><strong>读取</strong>: 使用 <code>pandas.read_excel(&#39;file.xls&#39;)</code>,底层依赖 <code>xlrd</code>。</li><li><strong>写入</strong>: 使用 <code>df.to_excel(&#39;file.xls&#39;)</code>,底层依赖 <code>xlwt</code>。</li><li><strong>注意</strong>: 牢记 <code>.xls</code> 格式有 65536 行的行数限制。</li></ul>
<p><strong>给初学者的最终建议</strong>:除非工作环境强制要求使用 <code>.xls</code>,否则在生成新文件时,<strong>强烈建议使用现代的 <code>.xlsx</code> 格式</strong>。它体积更小、更安全、且支持更多的数据量。</p>
頁: [1]
查看完整版本: Python新手指南之如何读写旧版Excel(.xls)格式文件