2010-04-01 3 views
3

두 개의 탭으로 구분 된 .csv 파일이 있습니다. 나는처럼 보이는 사전 만든 one.csv에서 :파이썬에서 사전을 만들고 다른 파일로 바꾸기

'EB2430': ' "\t"idnD "\t"yjgV "\t"b4267 "\n', 
'EB3128': ' "\t"yagE "\t\t"b0268 "\n', 
'EB3945': ' "\t"maeB "\t"ypfF "\t"b2463 "\n', 
'EB3944': ' "\t"eutS "\t"ypfE "\t"b2462 "\n', 

내가 보이는 second.csv 파일에 사전의 값을 삽입 할을 같은 : 결과적인와

"EB2430" 36.81 364 222 4 72 430 101 461 1.00E-063 237 
"EB3128" 26.04 169 108 6 42 206 17 172 6.00E-006 45.8 
"EB3945" 20.6 233 162 6 106 333 33 247 6.00E-005 42.4 
"EB3944" 19.07 367 284 6 1 355 1 366 2.00E-023 103 

출력 탭으로 구분 :

,443 : 여기
'EB2430' idnD yjgV b4267 36.81 364 222 4 72 430 101 461 1.00E-063 237 
'EB3128' yagE b0268 26.04 169 108 6 42 206 17 172 6.00E-006 45.8 
'EB3945' maeB ypfF b2463 20.6 233 162 6 106 333 33 247 6.00E-005 42.4 
'EB3944' eutS ypfE b2462 19.07 367 284 6 1 355 1 366 2.00E-023 103 

이 사전을 만들기위한 내 코드입니다210

너무 오래 바람을 피워 죄송합니다. 나는 오랫동안 프로그래밍하지 못했다.

건배! 좀 더 유용하게 여기 파이썬 표준 라이브러리 csv 모듈을 사용할 수 있습니다처럼

답변

2

는 것 같습니다. 텍스트 처리 부분을 스스로 "수동으로"수행하는 것이 아닙니다. 예를 들면 :

import csv 
with open("one.csv", "r") as f: 
    rows_one = list(csv.reader(f, delimiter='\t')) 
with open("second.csv", "r") as g: 
    rows_two = list(csv.reader(g, delimiter='\t')) 
rows_totl = [r + s[1:] for r, s in zip(rows_one, rows_two)] 
with open("total.csv", "w") as h: 
    csv.writer(h, delimiter='\t').writerows(rows_totl) 

with 문은 파이썬 2.6의 보석 중 하나입니다 (이것은 2.5도 가능하지만 경우에만 당신 from __future__ import with_statement -!) - 여기에 사용되는, 그것은 당신에게 열려있는 파일을 제공하고 보장 곧 with 시체가 끝났을 때 닫힙니다. 더하기, 더 많은 용도가 있습니다. 자물쇠 및 모든 종류의 사용자 정의 코딩 된 컨텍스트 관리자.

+0

니스 솔루션을! – systempuntoout

+0

Alex, csv 모듈을 사용하는 것 외에도 "with"문을 사용하고 있습니다. 왜 당신이 그 변화를 만들 었는지 지적하는 것이 좋을 수도 있습니다. –

+0

@ 존, 그걸 지적하고 편집해라. –

0

CSV 파일을 직접 파싱하는 대신 csv을 사용하는 것이 좋습니다. 너무, 그것의 API는 간단하다 구분 기호의 관리, 문자 등 탈출을 취

import csv 

# Auto-detector of this particular CSV dialect (delimiters and such) 
dialect = csv.Sniffer().sniff(open('one.csv').read()) 

# csv.reader yields every row found in the file using the given dialect 
rows = csv.reader(open('one.csv'), dialect = dialect) 

# [list comprehension][2] 
resulting_dict = dict((row[0], row[1:]) for row in rows) 

있습니다 (오류를 조심하지만, 메모리에서 코딩) 함수에 코드를 리팩토링 두 파일을 사용할 수 있습니다.

는 이제 두 개의 파일이 dicts있어, 당신이 그들을 결합 할 수 있습니다,의는 dict1dict2을 가정 해 봅시다 : .csv 파일로 작성

combined_dict = dict((key, dict1[key] + dict2[key]) for key in dict2) 

는 간단하다 :

writer = csv.writer(open('second.csv', 'w'), delimiter = '\t') 
for key, values in combined_dict: 
    writer.writerow(key, *values) 

자세한 내용은 docs을 확인하십시오.

편집 : 내 솔루션은 줄 순서를 고려하지 않습니다 (사전은 순서가 지정되지 않음). 두 가지 해결책이 있습니다 : 파이썬 3 파이썬 2.7을 실행하는 경우

  • 그렇지 않으면 collections.OrderedDict를 사용하여, 당신은 라인의 순서로 저장해야 - 두 번째 파일 휴식을 읽는 동안, 예를 들어 목록 이해력 표준 for 진술하고 목록에 헤더를 저장하십시오.
0

csv 모듈을 살펴 유무 :

import csv 
reader1 = csv.reader(open('input1.csv'), delimiter = '\t') 
reader2 = csv.reader(open('input2.csv'), delimiter = '\t') 
csvwriter = csv.writer(open('output.csv', 'w'),delimiter = '\t') 
while True: 
    row1 = reader1.next() 
    if row1: 
     row2 = reader2.next() 
     new_row = row2 + row1[1:] 
     csvwriter.writerow(new_row) 
    else: 
     break 
관련 문제