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

Ignore newline character in binary file with Python?

我这样打开我的文件:

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作为后面的第一个字节我读过。我不想简单地使用 .splitlines(),因为某些数据内部可能有 n,我不想破坏它。顺便说一句,我正在使用 Python 2.7.10。我还读到用行字符的新 line/end 的 b 参数 "takes care" 打开一个二进制文件;为什么我不是这样?

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

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

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

>>> 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"")

(根据聊天中与 OP 的讨论)

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

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