Python读取txt中文乱码怎么办?encoding参数设置指南

Owen
Owen
发布时间:2026-11-02| 9人浏览过
原创

针对Python读取txt文本时常见的中文乱码与UnicodeDecodeError报错,详细解析文件编码原理,提供encoding参数设置方法、编码排查流程及errors容错配置指南。

很多开发者在刚开始用 Python 读取文本文件时,几乎都会遇到这样的场景:本地新建一个 data.txt,里面写了几行中文说明,写好代码 with open('data.txt', 'r') as f: content = f.read() 一运行,控制台立刻弹出一串鲜红的错误信息:UnicodeDecodeError: 'gbk' codec can't decode byte 0x... in position ...: illegal multibyte sequence;或者虽然代码没有报错,但打印出的内容全是类似“锟斤拷”、“锘挎垜”或者问号的怪异字符。产生这一现象的根本原因是文件存储所用的字符编码与 Python 读取时使用的解码方式不一致。解决此类问题的核心抓手,就是在 open() 函数中显式且正确地传入 encoding 参数。

Python读取txt中文乱码怎么办?encoding参数设置指南
图 1:文件编码与解码器不匹配时的异常产生流程

一、为什么 Python 读取 txt 会出现中文乱码?

所有存放在计算机磁盘上的文件,本质上都只是一串连续的二进制字节(Bytes)。当我们要把这些字节显示为人类可读的文字(String)时,必须通过一张对照表来进行转换,这张对照表就是“字符编码”。

在 Python 3 中,字符串对象在内存中统一以 Unicode 形式存储。当你使用 open(filename, 'r') 打开文本文件时,Python 必须把磁盘中的二进制字节流解码(Decode)成 Unicode 字符串。如果你在调用 open() 时省略了 encoding 参数,Python 并不会智能分析文件内容,而是直接向操作系统询问当前环境的默认文本编码(即 locale.getpreferredencoding() 的返回值):

  • Windows 简体中文版:系统默认编码一般为 cp936(即 GBK 编码的一种变体)。
  • Linux 与 macOS:系统默认编码绝大多数为 utf-8。

现代大多数编辑器(如 VS Code、Sublime Text)或在线下载的文本文件,默认均使用 UTF-8 保存。在 Windows 系统上,Python 默认尝试用 GBK 规则去解释 UTF-8 组织起来的字节。当它遇到 UTF-8 中特定的 3 字节中文字符时,GBK 解码器找不到对应的规则,就会直接抛出 UnicodeDecodeError;反之,如果是旧系统导出的 GBK 文本在 Linux 或设置了 UTF-8 的环境下读取,也会同样报错。

二、encoding 参数的基本配置与规范写法

解决乱码问题的首要准则,就是永远不要依赖系统的默认编码,始终显式声明 encoding 参数。在绝大多数情况下,显式指定 encoding='utf-8' 即可顺利解决问题。

标准且安全的文件读取代码如下:

# 标准写法:使用 with 语句确保文件自动关闭,并显式指定 encoding
file_path = 'example.txt'

try:
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()
    print("读取成功,内容如下:")
    print(content)
except UnicodeDecodeError as e:
    print(f"解码失败:当前指定的编码与文件实际编码不符。详细原因:{e}")
except FileNotFoundError:
    print(f"文件未找到,请检查路径:{file_path}")

注意:参数名称必须为 encoding,且取值为小写字符串,例如 'utf-8'、'gbk' 或 'gb18030'。在 Python 中编码名称对大小写不敏感,连字符和下划线通常通用(如 utf8 和 utf-8 等价),但推荐使用官方标准形式 utf-8。

三、中文场景常用编码格式对比与选型

在处理中文文本时,我们主要会接触到四种编码格式。了解它们的特性,能够帮助你在遇到复杂文本时迅速做出正确选择。

Python读取txt中文乱码怎么办?encoding参数设置指南
图 2:常用中文编码格式的特性、关系与适用场景
编码类型 Python 参数值 常见来源 核心注意事项
UTF-8 encoding='utf-8' VS Code、PyCharm、网络爬虫、现代主流软件 首选配置。跨平台兼容性最佳。
UTF-8 带 BOM encoding='utf-8-sig' Windows 自带记事本“另存为”保存的文件 若用普通 utf-8 读取,首行开头会出现不可见字符 \ufeff,用 utf-8-sig 可自动剥离。
GBK encoding='gbk' 早期的 Windows 记事本、国内旧版业务管理软件 若文本含有部分生僻人名、地名,GBK 可能会报解码错误。
GB18030 encoding='gb18030' 政府机构数据、金融及大型国企旧系统导出文档 向下兼容 GBK,字符集更全,是解决传统中文编码报错的兜底利器。

四、排查与确定文件真实编码的实战步骤

当你拿到一个来源未知的 txt 文件,且 encoding='utf-8' 报错时,不要盲目乱试。推荐按照以下四步排查流程解决:

Python读取txt中文乱码怎么办?encoding参数设置指南
图 3:txt 中文乱码故障四步排查与解决流程

1. 通过常用文本编辑器直接查看

这是最直接也最直观的方法。使用 VS Code 打开目标 txt 文件,查看窗口右下角状态栏:

  • 如果显示为 UTF-8,直接设置 encoding='utf-8'。
  • 如果显示为 UTF-8 with BOM,设置 encoding='utf-8-sig'。
  • 如果显示为 GB2312 或 EUC-CN,设置 encoding='gb18030'。

2. 使用第三方库自动探测文件编码

当需要批量自动化处理成百上千个编码各异的 txt 文件时,无法人工打开检查。可以使用 Python 社区成熟的检测库 charset-normalizer(Python 3 推荐,替代传统的 chardet)来自动探测:

from charset_normalizer import from_path

def detect_and_read(file_path):
    # 读取二进制特征并推测编码
    results = from_path(file_path)
    best_match = results.best()
    
    if best_match is not None:
        detected_encoding = best_match.encoding
        print(f"检测到文件编码为:{detected_encoding}")
        # best_match 自带解码后的文本
        return str(best_match)
    else:
        # 检测失败时的兜底逻辑
        with open(file_path, 'r', encoding='gb18030', errors='replace') as f:
            return f.read()

# 示例调用
# text = detect_and_read('unknown_file.txt')

五、遇到脏数据或损坏文件:errors 参数的使用指南

有些时候,文本文件本身可能混合了不同来源的内容,或者在传输过程中损坏了几个字节。此时,无论你将 encoding 设置为 utf-8 还是 gb18030,Python 都会在遇到损坏字节的那一行报错中断。此时,可以通过 open() 的 errors 参数来决定解码失败时的容错策略。

参数值 处理策略 适用场景与行为表现
errors='strict' 严格模式(默认) 遇到任何无法解码的字节立刻抛出 UnicodeDecodeError,保障数据绝对干净。
errors='ignore' 直接忽略 跳过无法解码的非法字节,继续解析后续内容。缺点是会丢失字符且无提示。
errors='replace' 安全替换 推荐的容错方案。将无法识别的字节替换为标准替换字符 ? 或 \ufffd(表现为一个带问号的小黑菱形),既不中断程序,又能保留位置信息。
errors='surrogateescape' 转义保留 常用于系统底层文件路径或网络协议交互,将非法字节映射为特殊 Unicode 码点,写回磁盘时能原样还原。

结合 encoding 与 errors='replace' 的健壮读取示例:

# 面对可能存在脏字符的复杂文件,使用 replace 容错
with open('legacy_data.txt', 'r', encoding='gb18030', errors='replace') as f:
    for line_num, line in enumerate(f, start=1):
        if '\ufffd' in line:
            print(f"第 {line_num} 行包含无法正常解码的字符,已自动替换为占位符。")
        # 处理业务逻辑

六、排查决策树与终极避坑清单

为了在日常开发中形成快速反应习惯,下图整理了面对读取 txt 乱码时的决策路径:

Python读取txt中文乱码怎么办?encoding参数设置指南
图 4:Python 处理 txt 乱码的排查与处理全景决策树

在日常开发与维护中,还应当牢记以下几点细节经验:

  1. 写文件时同样要指定编码:调用 open(file, 'w', encoding='utf-8') 显式保存,这样无论后续脚本在 Windows 还是 Linux 上被执行,都能确保输出的标准统一。
  2. 慎用 GBK,优先考虑 GB18030:如果确认文本是中文旧编码,在遇到极少数生僻人名、特殊古籍字符报错时,将 'gbk' 替换为 'gb18030',通常无需做任何其他改动即可通过。
  3. 警惕 BOM 字符的存在:如果你用普通 utf-8 读取由 Windows 记事本编辑的文件并使用字典键索引时,首行的键名很可能会变成 \ufeffname 而导致 KeyError,遇到类似问题将编码换成 utf-8-sig 即可自动剥离开头的 BOM 标记。
  4. 数据分析库传参同步:使用 Pandas 的 pd.read_csv() 或 pd.read_table() 读取含有中文的 txt/csv 时,同样支持传入 encoding='utf-8' 或 encoding='gb18030' 参数,其底层逻辑与原生 open() 完全一致。
相关标签:

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

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 算法库。