[英]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.