多くのファイルを 1 つのファイルのように扱いたい。[filenames] => [file objects] => [lines] をジェネレーターで使用する/ファイル全体をメモリに読み込まないための適切なpythonicの方法は何ですか?
私たちは皆、ファイルを開く正しい方法を知っています:
with open("auth.log", "rb") as f:
print sum(f.readlines())
そして、複数のイテレータ/ジェネレータを 1 つの長いイテレータ/ジェネレータにリンクする正しい方法を知っています。
>>> list(itertools.chain(range(3), range(3)))
[0, 1, 2, 0, 1, 2]
しかし、どうすれば複数のファイルを一緒にリンクし、コンテキスト マネージャーを保持することができるでしょうか?
with open("auth.log", "rb") as f0:
with open("auth.log.1", "rb") as f1:
for line in itertools.chain(f0, f1):
do_stuff_with(line)
# f1 is now closed
# f0 is now closed
# gross
コンテキスト マネージャーを無視して、次のようなことを行うこともできますが、正しくないと感じます。
files = itertools.chain(*(open(f, "rb") for f in file_names))
for line in files:
do_stuff_with(line)
それとも、この種のAsync IO - PEP 3156の目的であり、後でエレガントな構文を待つ必要がありますか?