读取二进制文件并遍历每个字节

新手上路,请多包涵

在 Python 中,如何读取二进制文件并遍历该文件的每个字节?

原文由 Jesse Vogt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 575
2 个回答

Python >= 3.8

感谢 海象运算符( := ,解决方案非常短。我们从文件中读取 bytes 对象并将它们分配给变量 byte

 with open("myfile", "rb") as f:
    while (byte := f.read(1)):
        # Do stuff with byte.

Python >= 3

在较旧的 Python 3 版本中,我们不得不使用稍微更冗长的方式:

 with open("myfile", "rb") as f:
    byte = f.read(1)
    while byte != b"":
        # Do stuff with byte.
        byte = f.read(1)

或者正如 benhoyt 所说,跳过不等于并利用 b"" 评估为 false 的事实。这使得代码在 2.6 和 3.x 之间兼容,无需任何更改。如果您从字节模式转到文本模式或相反,它还可以避免您更改条件。

 with open("myfile", "rb") as f:
    byte = f.read(1)
    while byte:
        # Do stuff with byte.
        byte = f.read(1)

Python >= 2.5

在 Python 2 中,它有点不同。这里我们得到的不是字节对象,而是原始字符:

 with open("myfile", "rb") as f:
    byte = f.read(1)
    while byte != "":
        # Do stuff with byte.
        byte = f.read(1)

注意 with 语句在低于 2.5 的 Python 版本中不可用。要在 v 2.5 中使用它,您需要导入它:

 from __future__ import with_statement

在 2.6 中不需要。

Python 2.4 及更早版本

f = open("myfile", "rb")
try:
    byte = f.read(1)
    while byte != "":
        # Do stuff with byte.
        byte = f.read(1)
finally:
    f.close()

原文由 Skurmedel 发布,翻译遵循 CC BY-SA 4.0 许可协议

该生成器从文件中生成字节,以块的形式读取文件:

 def bytes_from_file(filename, chunksize=8192):
    with open(filename, "rb") as f:
        while True:
            chunk = f.read(chunksize)
            if chunk:
                for b in chunk:
                    yield b
            else:
                break

# example:
for b in bytes_from_file('filename'):
    do_stuff_with(b)

有关 迭代器生成 器的信息,请参阅 Python 文档。

原文由 codeape 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题