簡體   English   中英

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

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM