2009-12-08 45 views
0

元素我有兩個文件是zipped的東西,如下列:跳過拉鍊

for line in zip(open(file1), open(file2)): 
    # do-something 

不幸的是,現在文件2已經改變,並且有開頭的附加導線。是的,我可以手動(或附加腳本/程序)擺脫這種情況,但由於涉及的文件的實際數量很大,我寧願在此級別解決問題。

所以,我要的是類似以下(這將是有效的,如果打開(文件)是標化):

for line in zip(open(file1), open(file2)[1:]): 
    # do-something 

回答

2

itertools看看:

for line in itertools.izip(
    open(file1), 
    itertools.islice(open(file2), 1, None) 
    ): 
    # do something 

編輯:從zip更改爲itertools.izip函數。

+0

我也建議切換到'itertools.izip',如亞歷克斯建議,以節省內存。 – 2009-12-08 23:30:05

1
f1 = open(file1) 
f2 = open(file2) 
f2.next() # Skip the first line of file2 (used to be readline() - thanks, Alex) 
for line in zip(f1, f2): 
    # do-something 
+0

危險 - 它在當前的CPython實現中起作用,但通常將文件迭代和對其他文件方法的調用混合在一起是脆弱的並且不能保證,請參閱http://docs.python.org/library/stdtypes.html?highlight=readline #file.next(在當前的CPython實現中,'next'然後'readline'中斷,反之亦然 - 但是,爲什麼在next(f2)'是一個完全可靠和有保證的方式來「跳過file2的第一行「?!)。 – 2009-12-08 22:50:34

+0

固定 - 謝謝! – RichieHindle 2009-12-08 22:55:16

4

open給你一個迭代器,所以它不是「標化」,但它可以很容易地通過一個先進(帶有內置的2.6或更好的next,在老的Python版本.next()方法 - 我假設2.6或更高)。

那麼,你想說:

for line in zip(open(file1), open(file2)[1:]): 

說,而不是:

f2 = open(file2) 
next(f2) 
for line in zip(open(file1), f2): 

,或者,如果你在單行熱衷:

import itertools as it 
for line in it.izip(open(file1), it.islice(open(f2), 1, None)): 

在後一種情況下,由於我正在導入itertools,我也趁其使用izip方法r ather比內存浪費zip內置;-)。

+0

+1其實我正在使用izip :-),但想保持簡單的問題。謝謝! – Davide 2009-12-08 22:52:14