解决Python读取Excel时的中文乱码与模块缺失报错

方予
方予
发布时间:2026-11-04| 4人浏览过
原创

针对Python使用Pandas或原生库读取Excel表格时常见的ModuleNotFoundError模块缺失与中文乱码、UnicodeDecodeError报错,提供从引擎安装、环境对齐到文件真伪识别与编码修复的完整排查与解决指南。

使用 Python 通过 Pandas 或专用库解析 Excel 文件时,最容易遇到的阻碍主要集中在两处:一是运行即抛出 ModuleNotFoundError: No module named 'openpyxl' 或 xlrd,二是读取后数据中的汉字显示为乱码方块、Unicode 转义串或直接抛出 UnicodeDecodeError。解决模块缺失的核心是明确执行环境并使用解释器绑定方式安装对应解析引擎;解决乱码的关键则是甄别伪装成 Excel 的文本文件(如实际为 GBK 编码的 CSV),并在输出环节对齐控制台编码。本文将针对这两类高频错误逐一拆解原因、修复步骤与自检方法。

解决Python读取Excel时的中文乱码与模块缺失报错
图 0:Python 读取 Excel 两大核心阻碍诊断分类图

一、模块缺失报错的成因与标准对齐修复

在执行 pd.read_excel('data.xlsx') 时,终端若弹出如下报错信息,说明 Python 当前解释器环境中缺少底层负责解包与解析 Excel 文件的具体引擎库:

错误终端输出示例
ModuleNotFoundError: No module named 'openpyxl'
ImportError: Missing optional dependency 'openpyxl'. Use pip or conda to install openpyxl.

Pandas 自身并不包含解析 Excel 二进制或 XML 压缩包的底层算法代码,它充当的是高层调度器。读取 .xlsx 格式默认依赖 openpyxl 库,而读取旧版 .xls 格式依赖 xlrd 库。许多开发者虽然在系统终端中执行过 pip install openpyxl,但随后在编辑器中运行代码依旧报错,其根本原因是多 Python 解释器环境不一致:系统全局 pip 安装的路径与编辑器(VS Code / PyCharm / Conda)当前调试所激活的虚拟环境脱节。

解决步骤:环境排查与定向安装四步法

解决Python读取Excel时的中文乱码与模块缺失报错
图 1:模块缺失排查与虚拟环境配置步骤示意图

第一步:查看当前代码真实调用的 Python 解释器位置

在当前报错的 Python 脚本开头加入以下两行代码并执行,获取当前运行内核的具体路径:

import sys
print("当前使用的解释器路径:", sys.executable)
输出结果示例
当前使用的解释器路径: /Users/username/myproject/.venv/bin/python

第二步:使用解释器绑定的形式执行 pip 安装

切忌在外部终端中直接运行无前缀的 pip install。务必使用当前解释器的绝对路径,或者在激活该虚拟环境后执行 python -m pip install。通过 -m pip 参数,可以确保依赖包精准写入当前运行环境的 site-packages 目录中:

# 推荐写法:使用 -m 参数绑定当前激活的 python 解释器
python -m pip install pandas openpyxl xlrd

# 如果是 Conda 虚拟环境,则在已激活的目标环境中执行:
conda install pandas openpyxl xlrd

第三步:对齐开发工具(IDE)的解释器设置

  • VS Code:按下快捷键 Ctrl + Shift + P(macOS 为 Cmd + Shift + P),输入并选择 Python: Select Interpreter,在列表中选中第一步打印出的解释器路径。
  • PyCharm:打开 File ➜ Settings(macOS 为 Preferences)➜ Project: [项目名] ➜ Python Interpreter,核对右侧解释器是否为刚才安装了依赖的环境。

第四步:执行模块导入极简自检

在项目中新建测试脚本运行自检:

import openpyxl
import pandas as pd

print("openpyxl 版本:", openpyxl.__version__)
print("pandas 版本:", pd.__version__)
print("依赖环境验证通过!")
注意事项: 如果你的网络环境受限导致安装缓慢或超时,可临时添加国内镜像源,例如使用 python -m pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple 进行加速。

二、Excel 文件格式与读取引擎版本陷阱

安装完成 openpyxl 和 xlrd 后,有时依然会发生引擎解析异常。最典型的是针对 .xlsx 格式调用 xlrd 引发的报错:

错误终端输出示例
xlrd.biffh.XLRDError: Excel xlsx file; not supported

产生该错误的原因在于:xlrd 在 2.0.0 版本之后,由于安全漏洞考量与架构精简,彻底移除了对 .xlsx 格式的支持,仅保留对 1997-2003 年代传统 .xls 二进制文件的读取能力。因此,不能对所有格式使用同一配置,而应当根据文件扩展名与真实底层规范对齐引擎。

解决Python读取Excel时的中文乱码与模块缺失报错
图 2:Excel 文件类型与底层解析引擎匹配矩阵
文件扩展名 实际底层文件结构 推荐指定引擎 正确代码示例
.xlsx / .xlsm OpenXML 压缩包(内含 UTF-8 XML) engine='openpyxl' pd.read_excel('data.xlsx', engine='openpyxl')
.xls BIFF8 二进制私有流(Excel 97-2003) engine='xlrd' pd.read_excel('old.xls', engine='xlrd')
伪装的 .xlsx (实为 CSV) ASCII / GBK / UTF-8 纯文本 改用 read_csv pd.read_csv('export.xlsx', encoding='gbk')
特别提醒: 在 Pandas 1.2 及以上版本中,若读取 .xlsx 文件时未显式指定 engine 参数,Pandas 默认会使用 openpyxl。如果显式传入了 engine='xlrd',或者本地未安装 openpyxl 且 Pandas 尝试回退,便会直接触发上述不支持错误。

三、中文乱码与编码报错排查及修复

许多开发者遇到表格读取乱码时,习惯性在 pd.read_excel() 中加入 encoding='utf-8' 或 encoding='gbk'。然而在较新版本的 Pandas 中,这一操作会直接导致报错:

错误终端输出示例
TypeError: read_excel() got an unexpected keyword argument 'encoding'

这是由于标准 Excel 文件(.xlsx)在物理层面绝不可能发生字符集未声明的乱码:.xlsx 本身是一个 ZIP 归档包,解压后内部的 xl/sharedStrings.xml 等所有文本数据全部强制遵循 UTF-8 编码。既然标准 Excel 内部统一为 UTF-8,那么日常开发中遇到的“中文乱码”和 UnicodeDecodeError 究竟从何而来?

解决Python读取Excel时的中文乱码与模块缺失报错
图 3:中文乱码与编码异常根因定位与修复流程

1. 常见根因一:业务系统导出的“伪装型”Excel 文件

在政企办公系统、CRM 或历史网站后台中,很多导出功能为了简省开发工作,直接将逗号分隔文本(CSV)或简易的 HTML 表格强行加上 .xlsx 或 .xls 后缀供用户下载。

当这种伪装文件被传入 pd.read_excel() 时,由于文件头不是合法的 ZIP 签名(PK),Python 引擎会报错抛出:

错误终端输出示例
zipfile.BadZipFile: File is not a zip file

验证与修复方法:

右键该文件,使用系统自带的记事本或文本编辑器打开。如果一眼能看到明文内容、逗号分隔符或 <table> 标签,证明这根本不是真正的 Excel 二进制文件,而是纯文本文件。此时必须改用文本方式读取,并指定实际编码:

import pandas as pd

# 修复方案:如果是逗号分隔的纯文本,使用 read_csv 读取并尝试国内常见的 GBK / GB18030
try:
    df = pd.read_csv('export_data.xlsx', encoding='utf-8-sig')
except UnicodeDecodeError:
    # 若 utf-8 解码失败,切换为 Windows 简体中文常用的 GB18030(兼容 GBK)
    df = pd.read_csv('export_data.xlsx', encoding='gb18030')

print(df.head())

2. 常见根因二:传统 .xls 早期文件的代码页冲突

对于真实的 1997-2003 格式 .xls 文件,文本采用 BIFF 二进制编码。如果该文件由某些旧式第三方报表软件生成且未正确写入代码页标识(Codepage),xlrd 可能会在解码汉字时报 UnicodeDecodeError。

修复方法:在调用底层库时显式覆盖编码页:

import xlrd

# 通过 encoding_override 参数强制指定简体中文代码页 CP936
workbook = xlrd.open_workbook('legacy_report.xls', encoding_override='cp936')
sheet = workbook.sheet_by_index(0)
print("第一行数据:", sheet.row_values(0))

3. 常见根因三:数据正常读入,但终端输出显示为乱码或转义符

有时运行 print(df) 或在循环中打印中文时,屏幕上显示为 中文 或一串问号 ???。此时数据在内存中的 DataFrame 内部是完全正确的 Unicode 字符,问题出在操作系统的终端显示编码与 Python 标准输出流的不匹配。

特别是在 Windows CMD 或早期 PowerShell 环境下,默认代码页往往是 936(GBK),当输出包含某些特殊 UTF-8 字符时就会造成控制台渲染错位。

修复方法:

  • 终端临时调整:在 Windows 命令行中先执行 chcp 65001 将控制台活动代码页切换为 UTF-8。
  • 代码中重配置标准输出流:在 Python 脚本开头加入以下语句,强制输出流以 UTF-8 格式传输文本:
import sys

# 保证在各类操作系统终端输出时均保持 UTF-8
if hasattr(sys.stdout, 'reconfigure'):
    sys.stdout.reconfigure(encoding='utf-8')

四、健壮读取 Excel 的通用工程封装实践

为了在自动化数据分析任务中同时兼顾模块可用性、格式兼容性与异常自动捕获,推荐在工程项目中采用具备自适应嗅探与容错处理的读取函数:

import os
import sys
import pandas as pd

def safe_read_table(file_path):
    """
    具备格式自适应与异常防御的通用表格读取函数
    :param file_path: 本地文件路径
    :return: pandas.DataFrame
    """
    if not os.path.exists(file_path):
        raise FileNotFoundError(f"未找到目标文件: {file_path}")

    ext = os.path.splitext(file_path)[1].lower()

    # 1. 处理 .xlsx 现代工作簿
    if ext in ['.xlsx', '.xlsm']:
        try:
            return pd.read_excel(file_path, engine='openpyxl')
        except Exception as e:
            # 如果遇到 BadZipFile,说明极可能是伪装为 xlsx 的 CSV 文本
            if 'BadZipFile' in str(type(e).__name__) or 'not a zip file' in str(e).lower():
                print(f"[警告] {file_path} 非标准zip包,尝试使用 CSV 引擎读取...")
                return _read_csv_fallback(file_path)
            raise e

    # 2. 处理旧版 .xls 工作簿
    elif ext == '.xls':
        try:
            return pd.read_excel(file_path, engine='xlrd')
        except Exception as e:
            # 兼容伪装的 .xls 文件
            return _read_csv_fallback(file_path)

    # 3. 处理纯文本与 CSV
    elif ext in ['.csv', '.txt']:
        return _read_csv_fallback(file_path)

    else:
        # 其他扩展名尝试默认 excel 解析
        return pd.read_excel(file_path)

def _read_csv_fallback(file_path):
    """CSV 多编码自动尝试机制"""
    encodings = ['utf-8-sig', 'gb18030', 'utf-8', 'big5']
    for enc in encodings:
        try:
            return pd.read_csv(file_path, encoding=enc)
        except (UnicodeDecodeError, pd.errors.ParserError):
            continue
    raise UnicodeDecodeError(f"无法使用常见编码集解析该文本文件: {file_path}")

# 运行示例
if __name__ == '__main__':
    # 模拟读取当前路径下的测试文件
    try:
        sample_df = safe_read_table('销售月报.xlsx')
        print("成功加载数据,数据维度:", sample_df.shape)
        print(sample_df.head(3))
    except Exception as err:
        print("读取流程中断,详情:", err)
解决Python读取Excel时的中文乱码与模块缺失报错
图 4:Python 读取 Excel 避坑与规范总结卡

五、常见问题排查清单

  • 为什么传了 encoding='utf-8' 会报 unexpected keyword argument?
    这是常见误区。在 Pandas 设计中,pd.read_csv() 接收文本流,需要 encoding 参数;而 pd.read_excel() 接收的是按特定格式封装的工作簿,字符编码由其引擎在内部自动解析,因此该函数本身不接收 encoding 参数。请勿将 CSV 读取习惯套用到 Excel 读取中。
  • Windows 路径中包含中文字符导致打不开文件?
    在 Windows 系统下读取带中文路径的文件时,推荐使用 Python 内置的 pathlib.Path 或在字符串前添加 r 前缀(如 r"D:\财务报表‚6年数据.xlsx"),以避免反斜杠被转义为特殊字符。
  • 安装了 openpyxl 之后依然提示找不到?
    请务必回到第一节的“步骤一”,检查运行脚本输出的 sys.executable。99% 的情况下是因为终端运行的 pip 属于系统默认 Python,而 IDE 编辑器右上角运行使用的是另一个 Python 虚拟环境。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。