В Python, как мне перебирать один итератор, а затем другой?

Я бы хотел повторить два разных итератора, что-то вроде этого:

file1 = open('file1', 'r') file2 = open('file2', 'r') for item in one_then_another(file1, file2): print item 

Который я ожидал бы распечатать все строки файла1, а затем все строки файла2.

Мне бы хотелось что-то общее, поскольку итераторы могут быть не файлами, это просто пример. Я знаю, что смогу сделать это с помощью:

 for item in [file1]+[file2]: 

но это считывает оба файла в память, которые я бы предпочел избежать.

3 Solutions collect form web for “В Python, как мне перебирать один итератор, а затем другой?”

Используйте itertools.chain :

 from itertools import chain for line in chain(file1, file2): pass 

fileinput также обеспечивает аналогичную функцию:

 import fileinput for line in fileinput.input(['file1', 'file2']): pass 

Вы также можете сделать это с помощью простого выражения генератора :

 for line in (l for f in (file1, file2) for l in f): # do something with line 

с помощью этого метода вы можете указать некоторое условие в самом выражении:

 for line in (l for f in (file1, file2) for l in f if 'text' in l): # do something with line which contains 'text' 

Приведенный выше пример эквивалентен этому генератору с циклом:

 def genlinewithtext(*files): for file in files: for line in file: if 'text' in line: yield line for line in genlinewithtext(file1, file2): # do something with line which contains 'text' 

Я думаю, что наиболее Pythonic подход к этой конкретной проблеме файла заключается в использовании модуля fileinput (поскольку вам либо нужны сложные менеджеры контекста, либо обработка ошибок с open ), я собираюсь начать с примера Ashwini, но добавьте несколько вещей. Во-первых, лучше открыть флаг U для поддержки Universal Newlines (при условии, что ваш Python скомпилирован с ним, и большинство из них), ( r – режим по умолчанию, но явный лучше, чем неявный). Если вы работаете с другими людьми, лучше всего поддерживать их, предоставляя вам файлы в любом формате.

 import fileinput for line in fileinput.input(['file1', 'file2'], mode='rU'): pass 

Это также можно использовать в командной строке, так как это займет sys.argv [1:], если вы это сделаете:

 import fileinput for line in fileinput.input(mode='rU'): pass 

И вы передадите файлы в своей оболочке следующим образом:

 $ python myscript.py file1 file2 
  • Базовая загрузка и сохранение файлов на диске в python?
  • Матрица от Python до MATLAB
  • Файл сохранения файла Python
  • Как скопировать объект InMemoryUploadedFile на диск
  • Pandas: Как создать кадр данных случайных чисел?
  • Есть ли способ эффективно получить каждый файл в каталоге, содержащем миллионы файлов?
  • как удалить повторяющиеся строки в файле в Python
  • как выводить каждую строку в файле python
  • Python - лучший язык программирования в мире.