UnicodeDecodeError:“utf-8”编解码器无法解码位置 35 中的字节 0x96:无效的起始字节

Posted

技术标签:

【中文标题】UnicodeDecodeError:“utf-8”编解码器无法解码位置 35 中的字节 0x96:无效的起始字节【英文标题】:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 35: invalid start byte 【发布时间】:2018-01-13 17:34:54 【问题描述】:

我是 Python 新手,我正在尝试使用以下脚本读取 csv 文件。

Past=pd.read_csv("C:/Users/Admin/Desktop/Python/Past.csv",encoding='utf-8')

但是,出现错误“UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 35: invalid start byte”,请帮助我了解这里的问题,我在脚本中使用了编码认为它会解决错误。

【问题讨论】:

【参考方案1】:

这是一个老问题,但在搜索此错误的解决方案时出现。所以我想为所有仍然偶然发现这个线程的人回答。 在传递正确的编码参数值之前,可以检查文件的编码。 要获得编码,Windows 中的一个简单选项是在 Notepad++ 中打开文件并查看编码。然后可以在the python documentation 中找到编码参数的正确值。 查看question and the answers on ***,了解有关获取文件编码的不同可能性的更多详细信息。

【讨论】:

【参考方案2】:

这是因为您选择了错误的编码。

由于你是在 Windows 机器上工作,所以只是替换

Past=pd.read_csv("C:/Users/.../Past.csv",encoding='utf-8') 

Past=pd.read_csv("C:/Users/.../Past.csv",encoding='cp1252')

应该能解决问题。

【讨论】:

您如何确定cp1252 是正确的编码?可能不是,但您很幸运,因为它停止抛出错误,但现在您的数据中有不正确的字符。 @MarkRansom 是的【参考方案3】:

除非您确定文件编码,否则不要传递编码选项。默认值 encoding=None 将 errors="replace" 传递给调用的 open() 函数。编码错误的字符将被替换,然后您可以找出正确的编码或仅使用生成的 Dataframe。如果提供了错误的编码,pd 会将 errors="strict" 传递给 open() 并在编码不正确时得到 ValueError。

【讨论】:

这是一个很好的建议,但是从 pandas 1.3.0 版开始,这种默认行为不再成立,并且添加了一个新参数 'encoding_errors'。现在将其设置为“替换”将执行您所描述的操作。这有助于我解决这个问题,即我需要自动处理许多具有不同编码的文件(同时确保替换不会影响我感兴趣的数据)。【参考方案4】:

尝试使用:

pd.read_csv("Your filename", encoding="ISO-8859-1")

我从某个网站解析的代码被转换为这种编码,而不是标准的默认 UTF-8 编码。

【讨论】:

欢迎来到 ***。仅包含代码的答案往往会被标记为删除,因为它们是“低质量”的。请阅读有关回答问题的帮助部分,然后考虑在您的回答中添加一些评论。 是的,ISO-8859-1 消除了所有错误,因为每个可能的字节都映射到一个有效字符。但这并不意味着字符是正确的。您如何确定网站使用的正确编码?【参考方案5】:

使用下面的代码对我有用:

with open(keeniz_dir + '/world_cities.csv',  'r', encoding='latin1') as input:

【讨论】:

是的,latin1 消除了所有错误,因为每个可能的字节都映射到一个有效字符。但这并不意味着字符是正确的。【参考方案6】:

以下内容对我来说非常有效:

encoding = 'latin1'

【讨论】:

是的,latin1 消除了所有错误,因为每个可能的字节都映射到一个有效字符。但这并不意味着字符是正确的。 嗨,你能说得更具体点吗?或者你能参考一些资源吗?有兴趣。 您可以在Standard Encodings中看到Python支持的所有可能的编码;它们有很多,当它们呈现相同的字节时,它们会生成不同的字符。但是latin 的独特之处在于它是唯一一个没有无效字节的,唯一一个可以在不产生错误的情况下执行bytes(range(256)).decode('latin1') 您好 Ransom,感谢您的回复,这很有帮助。总是对编码问题感到害怕。【参考方案7】:

使用此解决方案,它将删除(忽略)字符并返回没有它们的字符串。仅当您需要剥离它们而不是转换它们时才使用它。

with open(path, encoding="utf8", errors='ignore') as f:

使用errors='ignore' 你只会丢失一些字符。但是如果您不关心它们,因为它们似乎是源自连接到我的套接字服务器的客户端的错误格式和编程的额外字符。然后它是一个简单的直接解决方案。 reference

【讨论】:

以上是关于UnicodeDecodeError:“utf-8”编解码器无法解码位置 35 中的字节 0x96:无效的起始字节的主要内容,如果未能解决你的问题,请参考以下文章

UnicodeDecodeError: ‘utf-8’ codec can’t decode byte...

UnicodeDecodeError:“utf-8”编解码器无法解码位置 0 的字节 0xff

UnicodeDecodeError:“utf-8”编解码器无法解码位置 34 中的字节 0x85:无效的起始字节

UnicodeDecodeError:“utf-8”编解码器无法解码位置 35 中的字节 0x96:无效的起始字节

UnicodeDecodeError:“utf-8”编解码器无法解码位置 1023 中的字节 0xe2:数据意外结束

UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xc0 in position 0: invalid start byte报错解决