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
相关产品推荐
相关产品推荐

