【发布时间】:2019-07-04 11:26:12
【问题描述】:
我正在读取一个 csv 文件,这是来自网络协议、十六进制字符和普通混合的一些痕迹。 我正在尝试读取 .csv,并且尝试了几种编码:utf-8、cp1252、latin1...
对于latin1:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb0' in position 51: ordinal not in range(128)
对于 utf-8:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 51: invalid start byte
对于cp1252:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb0' in position 51: ordinal not in range(128)
使用的代码是:
df=pd.read_csv(file,sep='`',error_bad_lines=False,encoding='cp1252',names=colnames,quotechar='"')
我不是编码方面的专家,但我想知道如何解决它。
找出我正在阅读的 csv 文件的当前编码?
是否有一个非常宽松的编解码器可以处理几乎所有内容?
谢谢。
【问题讨论】:
-
你的 csv 里面有什么?
-
对于 utf-8,您会在
read_csv中得到预期的UnicodeDecodeError,因为它包含非 utf-8 字符。对于 Latin1 和 cp1252,您可能会在不同的指令中获得UnicodeEncodeError(注意 Encode 而不是 Decode)。我需要完整的堆栈跟踪和相关代码才能为您提供帮助。 -
只有作者知道字符编码。询问、阅读文档、适用标准或观察其通信方式(例如,HTTP 响应标头 Content-Type。)或者 - 如果源支持它 - 使用不受此问题影响的格式,例如 . ods 或 .xlsx。
-
使用
cp1252你不应该得到错误'ascii' codec can't encode character u'\xb0'。您只能通过ascii获得它。使用b'\xb0'.decode('cp1252')我看到它可以是°(度数符号) -
@furas 所说的关于 latin1 和 cp1252 的说法都是正确的。 Latin1 是您的答案(在以任何顺序使用所有 256 字节值的数十种字符编码中)。似乎是一个糟糕的测试导致了这个问题。
标签: python pandas utf-8 ascii codec