使用pandas读取TSV文件category列出现UnicodeDecodeError如何解决
报错产生原因
这个报错本质是TSV文件的实际编码和pandas默认使用的UTF-8编码不匹配,文件中存在UTF-8无法解析的字节(报错信息中提到的0x89就是不符合UTF-8编码规范的字节)。你看起来文件没有特殊字符,是因为文本编辑器打开文件时自动做了编码兼容处理,只显示了可打印的内容,隐藏了不可见的特殊字节或者编码差异。这类问题常见于从Windows系统导出、或者用GBK/GB2312/Windows-1252/latin-1等非UTF-8编码保存的文件。
修复方法
不需要先通过open打开文件,直接将文件路径传入pd.read_csv,同时指定正确的encoding参数即可,按优先级可以依次尝试以下几种编码:
- 优先尝试
latin-1,该编码可以兼容所有单字节内容,不会触发解码报错,适合先读取文件验证内容:
import pandas as pd df = pd.read_csv(filename, sep='\t', encoding='latin-1')
- 如果文件包含中文内容,尝试中文编码:
# 尝试GBK编码 df = pd.read_csv(filename, sep='\t', encoding='gbk') # 兼容性更好的GB18030编码 df = pd.read_csv(filename, sep='\t', encoding='gb18030')
- 如果文件是带BOM的UTF-8编码,使用以下参数:
df = pd.read_csv(filename, sep='\t', encoding='utf_8_sig')
原有代码的其他问题
你编写的循环逻辑存在错误:你定义了空列表categoryList,但循环中是往categoryColumn(pandas的Series对象)追加元素,不符合你的预期。如果要将category列转为列表,直接调用内置的tolist()方法即可,不需要手动写循环:
categoryList = df["category"].tolist()
内容的提问来源于stack exchange,提问作者brownleaf
相关产品推荐
相关产品推荐

