You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.6.12读取CSV报UnicodeDecodeError,3.9.7正常如何修复?

解决Python 3.6.12读取含特殊字符文件时的UnicodeDecodeError问题

问题重现

在Python 3.6.12中执行以下代码时抛出UnicodeDecodeError:

import csv

fh = open('./testLog.log', 'r')
d = csv.DictReader(fh, delimiter=" ")
for row in d:
    print(row)

fh.close()

报错信息:

File "/opt/rh/rh-python36/root/usr/lib64/python3.6/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 2826: ordinal not in range(128)

相同代码在Python 3.9.7中可正常运行,推测是文件中包含如下特殊字符文本导致:

soe-admin�@Ys%20MacBook%20Pro

修复方案

  • 显式指定文件编码
    Python 3.6中open()函数默认编码依赖系统环境,多数场景下会默认使用ASCII;而Python 3.9+已默认采用UTF-8编码。因此打开文件时显式指定编码为UTF-8即可解决问题:

    import csv
    
    fh = open('./testLog.log', 'r', encoding='utf-8')
    d = csv.DictReader(fh, delimiter=" ")
    for row in d:
        print(row)
    
    fh.close()
    
  • 处理编码错误(可选)
    如果文件中存在UTF-8无法解析的字符,可添加错误处理参数,忽略错误或用占位符替换:

    # 忽略无法解码的字符
    fh = open('./testLog.log', 'r', encoding='utf-8', errors='ignore')
    
    # 用?替换无法解码的字符
    fh = open('./testLog.log', 'r', encoding='utf-8', errors='replace')
    
  • 确认文件实际编码
    如果指定UTF-8仍报错,可先用chardet库检测文件实际编码:

    import chardet
    
    with open('./testLog.log', 'rb') as f:
        result = chardet.detect(f.read())
    
    print(result['encoding'])  # 输出文件实际编码,如'gbk'、'utf-8-sig'等
    

    之后用检测到的编码打开文件即可。

内容的提问来源于stack exchange,提问作者Ahtesham Akhtar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:52:36