如何在Python中解码错误消息的位置?

时间:2017-02-16 01:39:03

标签: python python-3.x

我一直收到这个' Unicodedecodeerror'

  
    
      
        

UnicodeDecodeError:' charmap'编解码器不能解码位置16592600中的字节0x8d:字符映射到

      
    
  

尝试为unicode .txt文件运行以下内容时

f=open('FY16_Query_Analysis1.txt','rU')
raw=f.read()

2 个答案:

答案 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))