2013-10-22 57 views
1

我試圖編寫一個Python(2.7)腳本來將多個CSV列表添加到一起(簡單附加),但不會添加共享元素的文件X中的任何行第一列中)文件Y.這裏是我的審判腳本:將CSV文件與Python結合,無重複元素

import csv 
import glob 

with open('merged.csv','wb') as out: 
    seen = set() 
    output = [] 
    out_writer = csv.writer(out) 
    csv_files = glob.glob('*.csv') 
    for filename in csv_files: 
     with open(filename, 'rb') as ifile: 
      read = csv.reader(ifile) 
      for row in read: 
       if {row[1] not in seen} & {row[2] not in seen} & {row[3] not in seen}: 
        seen.add(row[1]) 
        seen.add(row[2]) 
        seen.add(row[3]) 
        output.append(row) 
    out_writer.writerows(output) 

我敢肯定,這可以被清理了一些,但它的試運行 - 爲什麼沒有適當添加從3列2,元素,如果它們出現在所考慮的行中,那麼不會追加該行?除了正確檢查重複,它已成功輸出合併文件。 (如果合併的文件已經存在於目錄中,這也可以工作,否則我會遇到麻煩嗎?)

非常感謝! :)

回答

1

我懷疑這條線不會做你想要什麼:

if {row[1] not in seen} & {row[2] not in seen} & {row[3] not in seen}: 

這是一個交集。演示:

>>> {False} & {True} 
set([]) 
>>> {True} & {True} 
set([True]) 
>>> {False} & {False} 
set([False]) 
>>> bool(set([False])) 
True #non-empty set is True in boolean context 

也許你打算

if row[1] not in seen and row[2] not in seen and row[3] not in seen: 

或(幾乎*)相當於

if all(value not in seen for value in row[1:4]): 

(*)如果有行

更少的值,這並不引發異常