【问题标题】:Reading a binary file: does Python have an unget() equivalent?读取二进制文件:Python 有 unget() 等价物吗?
【发布时间】:2017-09-26 21:01:43
【问题描述】:

我正在寻找一个二进制文件中的 2 字节序列,该文件太大而无法放入内存。我不能一次简单地读取 2 个字节,因为,例如

xx xx x1 2x xx

同样,我不能简单地寻找第一个然后查看第二个是否存在,因为

xx112xx

我真的很想能够做这样的事情:

with open("myfile", "rb") as f:
    byte = f.read(1)
    while byte:
        if byte == b'1':
            if f.read(1) == b'2':
                # success case
            else:
                # put back the latest byte somehow
        byte = f.read(1)

是否有一些功能可以在无需自己完成所有簿记细节的情况下完成这项前瞻性工作?

【问题讨论】:

    标签: python file lookahead


    【解决方案1】:

    io.BufferedReader() object 有一个peek() method

    从流中返回字节而不推进位置。最多对原始流进行一次读取以满足调用。返回的字节数可能少于或多于请求。

    每当您以二进制模式打开文件进行读取时,您都会得到这样一个对象,因此您可以直接在代码中使用它:

    with open("myfile", "rb") as f:
        for byte in iter(lambda: f.read(1), b''):
            if byte == b'1':
                if f.peek(1) == b'2':
                    # success case
    

    考虑到我们偷看的字节仍然“在流中”,下一个f.read() 调用将包含它。如果您不想这样做,则必须发出明确的 f.read(1)

    我用iter() 2-argument call 替换了您的while 循环,以便在for 循环中一次读取文件1 个字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 2017-11-27
      • 2011-12-26
      • 1970-01-01
      相关资源
      最近更新 更多