读取二进制文件:Python是否具有unget()等价物?

时间:2017-09-26 12:47:46

标签: python file lookahead

我在二进制文件中寻找一个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)

是否有一些功能可以完成这项前瞻性的工作而不需要自己完成所有的簿记细节?

1 个答案:

答案 0 :(得分:3)

io.BufferedReader() objectpeek() 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)

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