【问题标题】:How to determine the position from decoding error message in Python?如何从 Python 中的解码错误消息中确定位置?
【发布时间】:2017-02-16 01:39:03
【问题描述】:

我不断收到这个“Unicodedecodeerror”

UnicodeDecodeError:“charmap”编解码器无法解码位置 16592600 中的字节 0x8d:字符映射到

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

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

【问题讨论】:

  • 我认为这是正在读取的文本文件中位置 16592600 的字符。大多数文本编辑器、代码 IDE 等都应该有一个字符或光标位置指示器来在文本文件中找到该位置,类似于 -> stackoverflow.com/questions/17153333/…
  • 您需要尝试使用 UTF-8 进行解码(请参阅我的回答)。如果不起作用,您需要提供更多信息,以便我们帮助您猜出正确的编码。
  • 如果您知道有问题的文本应该表示什么,但不知道它的编码方式,您也许可以从像 cdn.rawgit.com/tripleee/8bit/master/encodings.html#8d 这样的查找表中收集正确的编码
  • @lenz,谢谢。我必须添加: encoding='utf_8' 才能运行文件。感谢您的帮助。

标签: python python-3.x


【解决方案1】:

总之,你要找出文本文件中使用的是什么编码,然后指定。

第 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 解码将始终有效(您甚至可以使用 Latin-1“解码”JPEG 图像) 1),但如果选择错误,结果是一串乱码。 您必须对不同的 8 位编码进行一些试验和错误,并查看有问题的位置以查看结果是否合理。

【讨论】:

    【解决方案2】:

    当您尝试使用错误的编码读取文件时,通常会出现此错误。但是考虑到您的情况非常高的偏移量,您也有可能拥有正确的编码,但文件中存在某种故障 - 没有必要推测具体细节。

    由于文件似乎大部分是正确的,我可以要求将未处理的字节替换为特殊字符 '�'(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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多