Python 按字节读取文件直到字节序列
Python read file by bytes until sequence of bytes
如何读取 Python byte-by-byte 中的文件,直到达到特定的字节序列?
对于读取特定类型文件以解析 header、扫描参数等的库,这一定会一直发生。
举个例子:我正在阅读 PNG spec 并看到像素数据在字节序列 IDAT
之后开始。
我可以这样读取文件:
with open('image.png', 'rb') as f:
byte = f.read(1)
while byte != '':
byte = f.read(1)
但是因为我一次只读一个字节,所以我不能直接看 IDAT
(因为我只会得到 I
而不是其他三个字节) .我无法按四个字节的块读取文件,因为它不会总是正确排列。
我可以想象跟踪最后四个字节,但认为也许有更优雅的方法?
如果您不接受逐字节处理的想法,您可以读取一个长字符串中的数据,然后按 IDAT
.
的出现次数拆分它
with open('image.png', 'rb') as f:
lines = f.readlines()
combined_line = b''.join(lines)
IDAT_splited = combined_line.split(b'IDAT')[1:]
使用 mmap
并将文件视为一个巨大的字符串。
import mmap
with open('image.png', 'rb') as f:
with mmap.mmap(f.fileno(), 0, mmap.PROT_READ) as mf:
offset = mf.find(b'IDAT')
if offset == -1:
raise Exception("IDAT not found")
f.seek(offset)
如何读取 Python byte-by-byte 中的文件,直到达到特定的字节序列?
对于读取特定类型文件以解析 header、扫描参数等的库,这一定会一直发生。
举个例子:我正在阅读 PNG spec 并看到像素数据在字节序列 IDAT
之后开始。
我可以这样读取文件:
with open('image.png', 'rb') as f:
byte = f.read(1)
while byte != '':
byte = f.read(1)
但是因为我一次只读一个字节,所以我不能直接看 IDAT
(因为我只会得到 I
而不是其他三个字节) .我无法按四个字节的块读取文件,因为它不会总是正确排列。
我可以想象跟踪最后四个字节,但认为也许有更优雅的方法?
如果您不接受逐字节处理的想法,您可以读取一个长字符串中的数据,然后按 IDAT
.
with open('image.png', 'rb') as f:
lines = f.readlines()
combined_line = b''.join(lines)
IDAT_splited = combined_line.split(b'IDAT')[1:]
使用 mmap
并将文件视为一个巨大的字符串。
import mmap
with open('image.png', 'rb') as f:
with mmap.mmap(f.fileno(), 0, mmap.PROT_READ) as mf:
offset = mf.find(b'IDAT')
if offset == -1:
raise Exception("IDAT not found")
f.seek(offset)