LoginSignup
9

More than 5 years have passed since last update.

posted at

Python の for 文で readlines() を使うな!

ついさっき、自分が昔書いたコードを見直していた時に、

try:
    with log_path.open(encoding='utf-8') as log_file:
        for line in log_file.readlines():
            ...

のようなコードをあちこちで書いていたことに気がつきました。

Python (注:バージョン2.4以降)のファイルハンドルはイテレーターですので、上記のコードの

        for line in log_file.readlines():

の行は、

        for line in log_file:

と書くべきですね。

enumerate() と組み合わせる場合も、

        for line_number, line in enumerate(log_file.readlines(), 1):

ではなく、

    for line_number, line in enumerate(log_file, 1):

と書いて問題ありません。

もし何らかの事情でどうしても readlines() メソッドを使ってファイルを一気に読み込みたい場合は、for 文に readlines() を書くのではなく、

log_lines = []
try:
    with log_path.open(encoding='utf-8') as log_file:
        log_lines = log_file.readlines()
except IOError:
    pass

for line in log_lines:
    ...

のように書くべきだと思います。

with ブロックがやたらと長いコードをたまに見かけますが、開いたファイルは必要がなければとっとと閉じるべきですし、with ブロックにスコープはありませんので、不要な処理をだらだら書かずにとっとと抜けましょうということですね。

以上、自分のコードのダメさ加減にかなりヘコんだので、自戒を込めた書いた Tips でした。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
9