1

我正在使用 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\xb7消息ID:

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

4

3 回答 3

2

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

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

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

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

于 2012-05-16T15:12:31.803 回答
2

问题在于“位置 7673 中的字节 0x8f”,而不是“位置 1 中的字节 0x00”。即,您的 NUL 不是问题。如果您查看wikipedia 上的 cp-1252 代码页,您会发现 0x8f 没有对应的字符。

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

于 2012-05-16T15:14:04.490 回答
0

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

f = open('file.txt','r')
f.readline()
于 2012-05-16T15:06:18.487 回答