2013-10-22 4 views
1

여러 CSV 목록을 함께 추가 (단순 추가)하기 위해 python (2.7) 스크립트를 작성하려고하지만 요소를 공유하는 파일 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) 

- 제대로 열 2, 3의 요소가 추가되지 않는 이유, 그리고 4를 보이는 세트에 놓은 다음 고려한 행에 나타나면 행을 추가하지 않습니까? 반복을 제대로 확인하는 것 외에도 병합 된 파일을 성공적으로 출력합니다. (병합 된 파일이 이미 디렉토리에 존재하는 경우에도 작동합니까? 아니면 문제가 있습니까?)

미리 감사드립니다. :) 내가이 줄을 의심

답변

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]): 

(*) 행

에서 적은 수의 값이있는 경우이 예외를 발생시키지 않습니다