我一直收到这个' Unicodedecodeerror'
UnicodeDecodeError:' charmap'编解码器不能解码位置16592600中的字节0x8d:字符映射到
尝试为unicode .txt文件运行以下内容时
f=open('FY16_Query_Analysis1.txt','rU')
raw=f.read()
答案 0 :(得分:0)
简而言之,您必须找出文本文件中使用的编码,然后指定它。
第2步很简单。例如,如果编码是UTF-8:
f = open('FY16_Query_Analysis1.txt', 'r', encoding='utf8')
(作为旁注:不推荐使用"U"
模式字符,您应该使用newline=None
指定通用换行模式,或者只是省略它,因为这是默认值。)
如果您未指定encoding=
,则会使用您的区域设置。
要在Python中查看它的设置,请尝试此操作(例如,在交互式会话中):
import locale
locale.getpreferredencoding()
这告诉你现在使用的是什么,这显然是错误的。
步骤1,找出正确的编码是什么,可能会很棘手。 如果您的文件来源没有告诉您,那么您必须猜测。 一个好的猜测始终是UTF-8,因为(a)它是普遍的,(b),更重要的是,它是挑剔的":如果UTF-8是错误的选择,那么它是您很可能会收到UnicodeError。
你应该试试这是否有效。 但是,如果它没有,那就变得棘手了。 您可能正在处理8位编码,在这种情况下,您不能依赖无异常传递 - 例如,使用Latin-1解码将始终有效(您甚至可以"解码" a带有Latin-1)的JPEG图像,但如果选择错误,结果就是一串乱码。 您必须使用不同的8位编码进行一些试验和错误,并查看有问题的位置以查看结果是否合理。
答案 1 :(得分:0)
当您尝试使用错误的编码读取文件时,通常会出现此错误。但是考虑到你的情况下偏移很高,你也可能有正确的编码但文件中存在某种故障 - 没有必要推测具体细节。
由于文件似乎大部分都是正确的,我可以要求将未处理的字节替换为特殊字符'�'
(Unicode "\ufffd"
)。然后,您只需搜索此字符即可找到错误的上下文。
f = open('FY16_Query_Analysis1.txt', errors="replace")
raw = f.read()
lines = raw.splitlines()
for line in lines:
if '�' in line:
print(line)
根据您所看到的内容,您可以决定下一步该做什么。
或者,您可以以二进制模式读取文件并转换有关偏移量的字符串;例如:
f=open('FY16_Query_Analysis1.txt','rb')
raw = f.read()
errorpos = 16592600
fragment = raw[errorpos-20:errorpos+40]
print(repr(fragment))