Jaki jest najbardziej pytoniczny sposób iteracji wszystkich linii wielu plików?

Chcę traktować wiele plików tak, jakby były jednym plikiem. Jaki jest właściwy pythoniczny sposób na pobranie [nazwy plików] => [obiekty plików] => [linie] z generatorami / brak odczytu całego pliku do pamięci?

Wszyscy znamy właściwy sposób otwierania pliku:

with open("auth.log", "rb") as f:
    print sum(f.readlines())

Znamy poprawny sposób łączenia kilku iteratorów / generatorów w jeden długi:

>>> list(itertools.chain(range(3), range(3)))
[0, 1, 2, 0, 1, 2]

ale jak połączyć wiele plików i zachować menedżerów kontekstu?

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

Mogłem zignorować menedżerów kontekstu i zrobić coś takiego, ale nie wydaje się to właściwe:

files = itertools.chain(*(open(f, "rb") for f in file_names))
for line in files:
    do_stuff_with(line)

A może tego rodzajuAsync IO - PEP 3156 jest i będę musiał później poczekać na elegancką składnię?

questionAnswers(1)

yourAnswerToTheQuestion