我这样打开我的文件:
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,)
答案 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"")