2012-12-30 3 views
1

2 개의 mysql 테이블에서 2 개의 CSV 파일을 생성했습니다. 이제 2 개의 파일을 병합하고 싶습니다.파이썬을 사용하여 공통 필드를 기반으로 2 개의 CSV 파일을 병합

내가 수동으로 처음 CSV이 헤더를 추가 :

ID,name,sector,sub_sector 

이 두 번째 CSV 헤더입니다 :

ID,name,sector,sub_sector,url 
:

ID,url 

내 목표는 1 개 개의 파일을 가지고있다

참고 : 첫 번째 파일의 전체 레코드가 두 번째 파일에서 일치하는 것은 아닙니다.

#!/usr/bin/env python 
import glob, csv 
if __name__ == '__main__': 

    infiles = glob.glob('./*.csv') 
    out = 'temp.csv' 
    data = {} 
    fields = [] 

    for fname in infiles: 
     df = open(fname, 'rb') 
     reader = csv.DictReader(df) 
     for line in reader: 
      # assuming the field is called ID 
      if line['ID'] not in data: 
       data[line['ID']] = line 
      else: 
       for k,v in line.iteritems(): 
        if k not in data[line['ID']]: 
         data[line['ID']][k] = v 
      for k in line.iterkeys(): 
       if k not in fields: 
        fields.append(k) 
     del reader 
     df.close() 

    writer = csv.DictWriter(open(out, "wb"), fields, extrasaction='ignore', dialect='excel') 
    # write the header at the top of the file 
    writer.writeheader() 
    writer.writerows(data) 
    del writer 

다른 강도 스레드에서 촬영 :

이 내가 사용 된 조각입니다.

File "db_work.py", line 30, in <module> 
    writer.writerows(data) 
    File "/usr/lib/python2.7/csv.py", line 153, in writerows 
    rows.append(self._dict_to_list(rowdict)) 
    File "/usr/lib/python2.7/csv.py", line 144, in _dict_to_list 
    ", ".join(wrong_fields)) 
ValueError: dict contains fields not in fieldnames: 4, 4, 4, 6 
~/Development/python/DB$ python db_work.py 
Traceback (most recent call last): 
    File "db_work.py", line 30, in <module> 
    writer.writerows(data) 
    File "/usr/lib/python2.7/csv.py", line 153, in writerows 
    rows.append(self._dict_to_list(rowdict)) 
    File "/usr/lib/python2.7/csv.py", line 145, in _dict_to_list 
    return [rowdict.get(key, self.restval) for key in self.fieldnames] 
AttributeError: 'str' object has no attribute 'get' 

어떤 아이디어를 어떻게이 문제를 해결하기 위해 : 이 내가지고있어 오류가 무엇입니까?

+0

여기 2 개의 오류가 있습니다. – Evilunclebill

+0

마음을 정교하게? – DjangoPy

+0

내가 잘못 입력했습니다 :-) 첫 번째 오류는 값 오류이므로 오타가 있거나 값이 존재할 경우 시도해 볼 수 있습니다. .get() 오류 - 사전을 정렬하는 중입니까? – Evilunclebill

답변

3

.writerows()목록이 일 것으로 예상하지만 대신 dict을 전달합니다. 내가 다음 다른 파일을 읽고 각 행을 쓰기 단지 id, url 행으로 파일을 읽어 딕셔너리에 사람들을 추가하는 것, 개인적으로

writer = csv.DictWriter(open(out, "wb"), fields, dialect='excel') 
# write the header at the top of the file 
writer.writeheader() 
writer.writerows(data.values()) 

: 나는 당신이 data 만의 값을 쓰고 싶다 생각 해당 url 항목을 추가하여 시간.

import csv 

with open('urls.csv', 'rb') as urls: 
    reader = csv.reader(urls) 
    reader.next() # skip the header, won't need that here 
    urls = {id: url for id, url in reader} 

with open('other.csv', 'rb') as other: 
    with open(out, 'wb') as output: 
     reader = csv.reader(other) 
     writer = csv.writer(output) 
     writer.writerow(reader.next() + ['url']) # read old header, add urls and write out 
     for row in reader: 
      # write out original row plus url if we can find one 
      writer.writerow(row + [urls.get(row[0], '')]) 
+0

@Evilunclebill : 아니오,'.writerow()'(단수)에 dict을 전달할 수 있습니다. '.writerows()'(plural)는 각 행의 목록을 취합니다. –

+0

아, 미안, 미안해! 소식을 틀린 것으로 삭제합니다. – Evilunclebill

+1

@Evilunclebill :'data' 구조체를 잘못 읽었습니다. 값은'dict'이기도하므로'DictWriter'도 사용할 수 있습니다. 업데이트 됨. URL을 추가하고 을 쓰기 # 오래된 헤더를 읽을 수(), reader.next() + ('URL') writer.writerow에 파일 "db_work.py", 라인 11 : –

관련 문제