[英]In Python, how do I iterate over one iterator and then another?
我想迭代两个不同的迭代器,如下所示:
file1 = open('file1', 'r')
file2 = open('file2', 'r')
for item in one_then_another(file1, file2):
print item
我希望打印file1的所有行,然后是file2的所有行。
我想要通用的东西,因为迭代器可能不是文件,这只是一个例子。 我知道我可以这样做:
for item in [file1]+[file2]:
但这会将两个文件都读入内存,我宁愿避免使用。
使用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
你会像下面这样传递shell中的文件:
$ python myscript.py file1 file2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.