1. ホーム
  2. python

[解決済み] バイナリファイルの読み込みと各バイトのループ処理

2022-03-24 07:07:13

質問

Pythonで、バイナリファイルを読み込んで、そのファイルの各バイトをループさせるにはどうしたらいいですか?

どのように解決するのですか?

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()

Python 2.5-2.7

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

with文はPythonの2.5以下のバージョンでは使用できないことに注意してください。v 2.5で使用するには、インポートする必要があります。

from __future__ import with_statement

2.6では必要ありません。

パイソン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 が言うように、not equal をスキップして 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)

パイソン3.8

これからは、:=演算子のおかげで、上記のコードを短く書くことができます。

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