Python读取含未定义字符的ANSI CSV文件报错求解决方案
解决Python读取ANSI编码CSV时的UnicodeDecodeError问题
遇到大文件里混有无法解码的特殊字符时,完全不用手动逐行处理,Python有几种简洁的方法可以自动处理这些异常字符,下面给你详细说明:
方法1:指定编码并设置错误处理规则
Windows上的"ANSI"编码其实是系统默认的本地编码(中文系统通常是gbk,英文系统多为cp1252),你可以在open()函数里明确指定编码,同时通过errors参数告诉Python如何处理无法解码的字符:
errors='ignore':直接跳过无法解码的字符errors='replace':用�替换无法解码的字符(保留位置,避免数据错位)
修改后的代码如下:
import csv # 中文Windows系统用gbk,英文系统可尝试cp1252 with open('ttest.dat', encoding='gbk', errors='ignore') as csvDataFile: csvReader = csv.reader(csvDataFile, delimiter="\t") for row in csvReader: print(row)
方法2:自动检测文件编码(更通用)
如果你不确定文件的具体编码(比如不同地区的ANSI编码存在差异),可以用chardet库自动检测编码,兼容性更强:
首先安装chardet:
pip install chardet
然后用下面的代码读取:
import csv import chardet # 读取部分内容完成编码检测(读前10k字符足够覆盖特征) with open('ttest.dat', 'rb') as f: detect_result = chardet.detect(f.read(10000)) # 用检测到的编码读取,同时忽略错误字符 with open('ttest.dat', encoding=detect_result['encoding'], errors='ignore') as csvDataFile: csvReader = csv.reader(csvDataFile, delimiter="\t") for row in csvReader: print(row)
为什么R能正常读取?
R的read.csv函数在Windows环境下会自动适配系统的ANSI编码,并且默认对无法解码的字符做了容错处理(比如自动替换或忽略);而Python的open函数在文本模式下默认遇到解码错误就抛出异常,所以需要我们手动指定errors参数来匹配R的容错行为。
内容的提问来源于stack exchange,提问作者N08
相关产品推荐
相关产品推荐

