Python 3中readlines()的Unicode错误处理

44

在读取文本文件时,我一直遇到这个错误。是否可能处理/忽略它并继续进行?

UnicodeEncodeError:'charmap'编解码器无法解码位置7827处的字节0x81:字符映射到未定义。

可以处理此错误并继续进行吗?

1
这取决于很多细节。是Python 2还是Python 3?您是否尝试解码已经读取的字符串?如何解码?等等。 - Charles Duffy
Python 3。我正在使用readlines()。 - Bob
好的 - 更新了问题以指定Python 3。Unicode是2和3之间存在非常大差异的地方之一; 请确保将版本明确指定为未来。 - Charles Duffy
对于更一般的情况,值得看看这个链接:https://stackoverflow.com/questions/58199571/unicodedecodeerror-utf-8-codec-cant-decode-byte-0xff-in-position-0-invalid - Dragonthoughts
3个回答

79
在Python 3中,创建文件对象时需要传递适当的errors=值(例如errors=ignoreerrors=replace),假设该对象是io.TextIOWrapper的子类(如果不是,请考虑将其包装在其中!)。此外,考虑传递比charmap更常见的编码(当您不确定时,utf-8始终是一个好的起点)。
例如:
f = open('misc-notes.txt', encoding='utf-8', errors='ignore')
在Python 2中,read()方法返回的是字节(bytes)数据;因此,解码这些数据以将其转换为字符串(如果您确实想要字符而不是字节)是比较关键的。如果您不知道字节数据的真实编码方式,可以采用以下策略:
your_string.decode('utf-8', 'replace')

...用于替换未处理的字符,或者

your_string.decode('utf-8', 'ignore')

可以简单地忽略它们。

话虽如此,找到并使用它们的真正编码(而不是猜测 utf-8)会更好。


小问题:在Python 2中,诀窍是解码它们,而不是编码。但你知道这一点,因为你正在调用“decode”方法。 - Thomas K
1
@ThomasK 噢,我减少了冗长的说辞——这样可以避免出错。感谢您的校对。 :) - Charles Duffy
通过传递编码和错误参数,似乎它正在工作。 - Bob
问题:有没有办法检查文件是用哪种编码生成的? - Bob
@Bob 确定 - 只需检查 fileobj.encoding(以及 fileobj.errors 用于错误处理模式); 只要 fileobjTextIOWrapper,就应该可以工作。 - Charles Duffy

2

为确保文件以UTF8编码进行解释,您应该使用codecs打开文件。

import codecs
fd = codecs.open(filename,'r',encoding='utf-8')
data = fd.read()

-5

是的,你可以用

来包装它。
try:
    ....
except UnicodeEncodeError: 
    pass

5
是的,但这并不能很好地帮助解释如何继续阅读文件的其余部分。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接