用Python忽略二进制文件中的换行符?

时间:2016-04-27 17:00:20

标签: python binaryfiles binary-data

我这样打开我的文件:

f = open("filename.ext", "rb") # ensure binary reading with b

我的第一行数据如下(使用f.readline()时):

'\x04\x00\x00\x00\x12\x00\x00\x00\x04\x00\x00\x00\xb4\x00\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00:\x00\x00\x00;\x00\x00\x00<\x00\x00\x007\x00\x00\x008\x00\x00\x009\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00\n'

事实是,我想逐字节地读取这个数据(f.read(4))。在调试时,我意识到当它到达第一行的末尾时,它仍然接受换行符\n 并且它被用作以下int的第一个字节我读过。我不想简单地使用.splitlines()因为某些数据内部可能有n而我不想破坏它。顺便说一句,我使用的是Python 2.7.10。我还读到打开带有b参数的二进制文件&#34;注意&#34;新行/行尾字符;为什么不是我的情况?

这是在控制台中发生的事情,因为文件的位置正好在换行符之前:

>>> d = f.read(4)
>>> d
'\n\x00\x00\x00'
>>> s = struct.unpack("i", d)
>>> s
(10,)

2 个答案:

答案 0 :(得分:1)

(在聊天中与OP讨论后)

似乎文件是二进制格式,换行符只是错误解释的值。例如,将10写入文件时可能会发生这种情况。

这并不意味着换行是有意的,而且可能不是。您可以忽略它被打印为\n并将其用作数据。

答案 1 :(得分:0)

您应该能够替换表明它是换行符的字节。

>>> d = f.read(4).replace(b'\x0d\x0a', b'') #\r\n should be bytes b'\x0d\x0a'
>>> diff = 4 - len(d)
>>> while diff > 0: # You can probably make this more sophisticated
...     d += f.read(diff).replace(b'\x0d\x0a', b'') #\r\n should be bytes b'\x0d\x0a'
...     diff = 4 - len(d)
>>> 
>>> s = struct.unpack("i", d)

这应该可以让您了解它的工作原理。这种方法可能会弄乱数据的字节对齐。

如果您确实在d的印刷品中看到"\n",请尝试.replace(b"\n", b"")