Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pythonic读取文件中NUL的方法_Python_Ascii_Binary Data_Filereader_Non Ascii Characters - Fatal编程技术网

Pythonic读取文件中NUL的方法

Pythonic读取文件中NUL的方法,python,ascii,binary-data,filereader,non-ascii-characters,Python,Ascii,Binary Data,Filereader,Non Ascii Characters,我正在使用python读取一个包含以下段的文本文件 (因为我是noob,所以无法发布屏幕截图)但这是记事本++中的样子: NULSOHSOHNULNULNULSUBMesssage-ID: 错误: Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> print(f.readline()) File "C:\Python32\lib\encodings\cp1

我正在使用python读取一个包含以下段的文本文件

(因为我是noob,所以无法发布屏幕截图)但这是记事本++中的样子:

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>
将文本作为二进制文件提供给我

b'\x00\x01\x01\x00\x00\x1a\XB7消息ID:


但是如何将文本转换为ascii码呢?处理这个问题最简单的方法是什么

是否以正确的读取模式打开

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

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

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

以文本模式打开文件时,您可以明确指出要使用哪种编码:

f = open('file.txt','r',encoding='ascii')
然而,您真正的问题是不同的:您引用的二进制片段不能被读取为ASCII,因为字节
\xb7
超出了ASCII范围(0-127)。异常回溯表明Python默认使用cp1252编解码器,而cp1252编解码器也无法解码您的文件


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

在文本模式下打开文件时,您可以明确指出要使用的编码方式:

f = open('file.txt','r',encoding='ascii')
然而,您真正的问题是不同的:您引用的二进制片段不能被读取为ASCII,因为字节
\xb7
超出了ASCII范围(0-127)。异常回溯表明Python默认使用cp1252编解码器,而cp1252编解码器也无法解码您的文件

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

问题在于“位置7673中的字节0x8f”,而不是“位置1中的字节0x00”。也就是说,你的NUL不是问题所在。如果查看,可以看到0x8f没有对应的字符

更大的问题是您的文件不是单一编码:它似乎是文本段的二进制框架的混合。您真正需要做的是找出该文件的格式,并将其解析为二进制片段(或者更丰富的数据结构,如元组、列表、dict、对象等),然后如果需要进一步处理,将文本片段解码为unicode。

问题在于“位置7673中的字节0x8f”,而不是“位置1中的字节0x00”。也就是说,你的NUL不是问题所在。如果查看,可以看到0x8f没有对应的字符


更大的问题是您的文件不是单一编码:它似乎是文本段的二进制框架的混合。您真正需要做的是找出此文件的格式,并将其解析为二进制片段(或者更丰富的数据结构,如元组、列表、dict、对象等),然后如果需要进一步处理,将文本片段解码为unicode。

它不是文本文件,所以你不能期望它是这样读的。问题不在于
NUL
,而在于其他一些符号。ASCII编解码器对ASCII控制字符没有任何问题。问题在于“字节0x8f位于7673位置”,而不是“字节0x00位于1位置”。也就是说,您的NUL不是问题所在。它不是文本文件,因此您不能期望读取它。问题不在于
NUL
,而在于其他符号。ASCII编解码器对ASCII控制字符没有任何问题。问题在于“字节0x8f位于7673位置”,而不是“字节0x00位于1位置”。也就是说,您的NUL不是问题所在。您是对的,该文件似乎具有二进制字符的ascii段。我喜欢你建议的方法。谢谢“Windows-1252代码点0x81、0x8D、0x8F、0x90、0x9D未分配。它们尚未表示任何字符”-您是对的,该文件似乎具有以二进制字符构成的ascii段。我喜欢你建议的方法。谢谢Windows-1252代码点0x81、0x8D、0x8F、0x90、0x9D未分配。它们尚未表示任何字符-