【问题标题】:Python read file by bytes until sequence of bytesPython按字节读取文件直到字节序列
【发布时间】:2019-12-22 02:40:16
【问题描述】:

如何在 Python 中逐字节读取文件,直到达到特定的字节序列?

对于读取特定类型文件以解析标头、扫描参数等的库,这种情况必须一直发生。

例如:我正在阅读PNG spec 并看到像素数据在字节序列IDAT 之后开始。

我可以这样读取文件:

with open('image.png', 'rb') as f:
    byte = f.read(1)
    while byte != '':
        byte = f.read(1)

但由于我一次只读取一个字节,我无法直接查看IDAT(因为我只会得到I 而不是其他三个字节)。我无法按四个字节的块读取文件,因为它并不总是正确排列。

我可以想象跟踪最后四个字节,但认为也许有更优雅的方式?

【问题讨论】:

    标签: python file png file-header


    【解决方案1】:

    如果您不接受逐字节读取的想法,您可以读取一个长字符串中的数据,然后将其拆分为 IDAT

    with open('image.png', 'rb') as f:
        lines = f.readlines()
        combined_line = b''.join(lines)
        IDAT_splited = combined_line.split(b'IDAT')[1:]
    

    【讨论】:

    • 谢谢!在最后一行,为什么从索引1 而不是0 读取?
    • 因为数据在“IDAT”上被分割,所以第一个元素会在它出现之前
    【解决方案2】:

    使用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)
    

    【讨论】:

      猜你喜欢
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多