Pythonic在文件中读取NUL的方式

时间:2012-05-16 14:54:26

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

我正在使用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处理这个的方法是什么?

3 个答案:

答案 0 :(得分:2)

在文本模式下打开文件时,您可以具体说明要使用的编码:

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

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

您需要确定文件的编码方式,或者始终将其作为二进制文件处理。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

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