pandas 使用编码阅读csv的问题- ISO-8859-1

omvjsjqw  于 2023-03-11  发布在  其他
关注(0)|答案(1)|浏览(85)

我正在阅读另一个团队每周发送的csv文件。
以前,我的python脚本阅读该文件时没有问题(使用panda),但使用本周的数据时,我得到了一个错误“UnicodeDecodeError:“ascii”编解码器无法解码位置208426中的字节0xa0:序号不在范围内(128)”
我发现另一篇stackoverflow的帖子是关于用chardet(python)检查csv编码的,我按照那个脚本操作,它显示encoding ='ascii',所以我更新了我的python read_csv如下:
df =pd.read_csv(“文件”,编码=“ascii”)
然而,我仍然得到了同样的错误。在进一步检查stackoverflow时,我偶然发现了一个建议使用encoding='ISO-8859-1'的帖子,它起作用了。
我尝试使用encoding='ISO-8859-1'对其他通常不需要编码的csv文件执行read_csv,令人惊讶的是,它对这些csv文件也有效。
我问发给我文件的团队是否做了任何编码,他们说没有。
我希望这不会最终咬我的屁股。将感谢任何人的投入。

zbwhf8kr

zbwhf8kr1#

每个文本文件都有一个编码,描述哪些字节转换为哪些字符。ASCII只支持字节值0-127,并为这些值分配特定字符,这就是为什么不支持字节值0xA 0(十进制160)。
ISO-8859-1为所有256个字节指定含义,0xA 0在该编码中是NO-BREAK SPACE
如果文件来自Windows计算机,则编码可以是任何旧版ANSI编码。Windows-1252在美国和大多数西欧Windows版本中很常见。0xA 0仍然是NO-BREAK SPACE,但其他字节值会有所不同,例如0x 80表示欧元符号(€)。
由于ISO-8859-1不会失败,但可能会将字节转换为错误的值,因此如果您不知道实际的编码,则必须查看非ASCII字符,看看它们在文本文件的上下文中是否有意义。
差异示例(errors='replace'处理未定义的解码与):

>>> bytes(range(128,256)).decode('iso-8859-1')
'\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0¡¢£¤¥¦§¨©ª«¬\xad®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
>>> bytes(range(128,256)).decode('windows-1252', errors='replace')
'€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ\xa0¡¢£¤¥¦§¨©ª«¬\xad®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
>>> bytes(range(128,256)).decode('ascii', errors='replace')
'��������������������������������������������������������������������������������������������������������������������������������'

进一步阅读:

相关问题