Я хочу обрабатывать много файлов, как если бы они были всего одним файлом. Какой правильный питонический способ взять [filenames] = > [file objects] = > [lines] с генераторами/не считывать весь файл в память?
Мы все знаем, как правильно открыть файл:
with open("auth.log", "rb") as f:
print sum(f.readlines())
И мы знаем правильный способ связать несколько итераторов/генераторов в один длинный:
>>> 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, и мне просто нужно подождать элегантного синтаксиса позже?