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)