2014-09-24 97 views
1

CSV文件,我必須到CSV文件,我需要對它們進行處理並行,這樣的:處理兩個並行

import csv 
with open(f1) as s1, open(f2) as s2: 
    for v1 in csv.reader(s1), v2 in csv.reader(s2): 
     assert v1[0] == v2[0] 
     myfunc(v1[1:],v2[1:]) 

唉,看來我不能做for a in b, c in d

NameError: global name 'v2' is not defined 

我想我可以做類似

with open(f1) as s1, open(f2) as s2: 
    r1 = csv.reader(s1) 
    r2 = csv.reader(s2) 
    while True: 
     try: 
      v1 = r1.next() 
     except StopIteration: 
      v1 = None 
     try: 
      v2 = r2.next() 
     except StopIteration: 
      v2 = None 
     if (not v1) and (not v2): 
      break 
     assert v1 and v2 
     assert v1[0] == v2[0] 
     myfunc(v1[1:],v2[1:]) 

但它看起來不漂亮。

那麼,我的其他選擇是什麼? (我做不是想用paste)。

+3

嘗試'爲V1,V2拉鍊(CSV。閱讀器(s1),csv.reader(s2))' – 2014-09-24 15:14:29

+1

要添加到@ColonelThirtyTwo,如果兩個csv文件有不均勻的行,您可能還想使用'itertools.izip_longest'。 – 2014-09-24 15:16:18

+1

或者如果兩個文件的長度相同,則使用'itertools.izip()'。 – martineau 2014-09-24 15:25:59

回答

4

假設這些文件:

1.csv:

Mark Smith 
Bobby Brown 
Sue Miller 
Jenny Igotit 

2.csv:

555-1234 
555-9876 
555-6743 
867-5309 

您可以使用izip:

fn1, fn2='/tmp/1.csv', '/tmp/2.csv' 

import csv 
from itertools import izip 

with open(fn1) as f1, open(fn2) as f2: 
    r1=csv.reader(f1) 
    r2=csv.reader(f2) 
    for v1, v2 in izip(r1, r2): 
     print v1, v2 

打印:

['Mark Smith'] ['555-1234'] 
['Bobby Brown'] ['555-9876'] 
['Sue Miller'] ['555-6743'] 
['Jenny Igotit'] ['867-5309'] 

如果可能有凹凸不平的文件長度,使用izip_longest:

import csv 

from itertools import izip_longest 

with open(fn1) as f1, open(fn2) as f2: 
    r1=csv.reader(f1) 
    r2=csv.reader(f2) 
    for v1, v2 in izip_longest(r1, r2): 
     print v1, v2 

2.csv刪除一行後,打印:

['Mark Smith'] ['555-1234'] 
['Bobby Brown'] ['555-9876'] 
['Sue Miller'] ['555-6743'] 
['Jenny Igotit'] None 
+0

使用zip會將所有行讀取到列表中。 itertools.izip是一個很好的替代品。這不適用於izip_longest。 爲了跨平臺兼容性,明確以'rb'模式打開文件是個好主意。 – awatts 2014-09-24 15:32:43