Ответ 1
Всегда fileinput
.
for line in fileinput.input(filenames):
...
Считывая источник, похоже, что fileinput.FileInput
не может использоваться в качестве менеджера контекста 1. Чтобы исправить это, вы можете использовать contextlib.closing
, поскольку экземпляры fileinput
имеют надежный реализованный метод close
:
from contextlib import closing
with closing(fileinput.input(filenames)) as line_iter:
for line in line_iter:
...
Альтернативой диспетчеру контекста является запись простой функции, зависающей над файлами и возвращающей строки:
def fileinput(files):
for f in files:
with open(f,'r') as fin:
for line in fin:
yield line
Нет реальной потребности в itertools.chain
здесь IMHO... Магия здесь находится в инструкции yield
, которая используется для преобразования обычной функции в фантастически ленивый генератор.
1 В стороне, начиная с python3.2, fileinput.FileInput
реализуется как менеджер контекста, который делает именно то, что мы делали раньше, с помощью contextlib
. Теперь наш пример:
# Python 3.2+ version
with fileinput.input(filenames) as line_iter:
for line in line_iter:
...
хотя другой пример будет работать и на python3.2 +.