在Python中,如何迭代一个迭代器然后另一个?

xor*_*yst 49 python iteration file

我想迭代两个不同的迭代器,如下所示:

file1 = open('file1', 'r')
file2 = open('file2', 'r')
for item in one_then_another(file1, file2):
    print item
Run Code Online (Sandbox Code Playgroud)

我希望打印file1的所有行,然后是file2的所有行.

我想要通用的东西,因为迭代器可能不是文件,这只是一个例子.我知道我可以这样做:

for item in [file1]+[file2]:
Run Code Online (Sandbox Code Playgroud)

但这会将两个文件都读入内存,我宁愿避免使用.

Ash*_*ary 89

用途itertools.chain:

from itertools import chain
for line in chain(file1, file2):
   pass
Run Code Online (Sandbox Code Playgroud)

fileinput 模块还提供了类似的功能:

import fileinput
for line in fileinput.input(['file1', 'file2']):
   pass
Run Code Online (Sandbox Code Playgroud)


ndp*_*dpu 17

您也可以使用简单的生成器表达式来完成:

for line in (l for f in (file1, file2) for l in f):
    # do something with line
Run Code Online (Sandbox Code Playgroud)

使用此方法,您可以在表达式中指定一些条件:

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

上面的例子相当于带循环的这个生成器:

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'
Run Code Online (Sandbox Code Playgroud)


Aar*_*all 7

我认为这个特定文件问题的最Pythonic方法是使用该fileinput模块(因为你需要复杂的上下文管理器或错误处理open),我将从Ashwini的例子开始,但添加一些东西.第一个是最好用UUniversal Newlines支持的标志打开(假设你的Python是用它编译的,大多数是),(r默认模式,但显式优于隐式).如果您正在与其他人合作,最好支持他们为您提供任何格式的文件.

import fileinput

for line in fileinput.input(['file1', 'file2'], mode='rU'):
   pass
Run Code Online (Sandbox Code Playgroud)

这也可以在命令行中使用,因为如果你这样做将需要sys.argv [1:]:

import fileinput

for line in fileinput.input(mode='rU'):
   pass
Run Code Online (Sandbox Code Playgroud)

你会像下面这样传递shell中的文件:

$ python myscript.py file1 file2
Run Code Online (Sandbox Code Playgroud)