【问题标题】:Pythonic way of reading NUL in a file在文件中读取 NUL 的 Pythonic 方式
【发布时间】:2012-05-24 04:06:15
【问题描述】:

我正在使用 python 读取一个文本文件,其中包含下面的段

(由于我是菜鸟,所以无法发布屏幕截图)但这就是记事本++中的样子:

NULSOHSOHNULNULNULSUBMesssage-ID:

错误:

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    print(f.readline())
  File "C:\Python32\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 7673: character maps to <undefined>

以二进制形式打开文件:

f = open('file.txt','rb')
f.readline()

给我二进制的文本

b'\x00\x01\x01\x00\x00\x00\x1a\xb7Message-ID:

但是我如何获得 ascii 格式的文本?处理这个的最简单/pythonic的方法是什么?

【问题讨论】:

  • 它不是一个文本文件,所以你不能指望这样阅读它。
  • 问题不在于NUL,而在于其他一些符号。 ASCII 编解码器对 ascii 控制字符没有任何问题。
  • 问题在于“位置 7673 中的字节 0x8f”,而不是“位置 1 中的字节 0x00”。也就是说,你的 NUL 不是问题。

标签: python ascii binary-data filereader non-ascii-characters


【解决方案1】:

问题在于“位置 7673 中的字节 0x8f”,而不是“位置 1 中的字节 0x00”。即,您的 NUL 不是问题。如果你看cp-1252 codepage on wikipedia,你可以看到0x8f没有对应的字符。

更大的问题是您的文件不是单一编码:它似乎是文本段的二进制框架的混合。你真正需要做的是弄清楚这个文件的格式并将其解析为二进制片段(或者可能是一些更丰富的数据结构,如元组、列表、字典、对象等),然后将文本片段解码为 un​​icode需要进一步处理。

【讨论】:

  • 你是对的,该文件似乎有以二进制字符框起来的 ascii 段。我喜欢你建议的方法。谢谢!
  • "Windows-1252 代码点 0x81, 0x8D, 0x8F, 0x90, 0x9D 未分配。它们还不代表任何字符" - i18nqa.com/debug/bug-double-conversion.html
【解决方案2】:

在文本模式下打开文件时,你可以明确告诉你使用哪种编码:

f = open('file.txt','r',encoding='ascii')

但是你真正的问题是不同的:你引用的二进制片段不能被读取为 ASCII,因为字节 \xb7 超出了 ASCII 范围(0-127)。异常回溯告诉 Python 默认使用 cp1252 编解码器,它也无法解码您的文件。

您需要确定文件具有哪种编码,或者始终将其作为二进制处理。

【讨论】:

    【解决方案3】:

    也许在阅读正确的阅读模式下打开它?

    f = open('file.txt','r')
    f.readline()
    

    【讨论】:

      猜你喜欢
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 2012-03-03
      • 2022-01-08
      • 2011-10-12
      相关资源
      最近更新 更多