2015-01-16 6 views
2

아래와 같은 내용의 텍스트 파일 두 개가 있다고 가정 해 보겠습니다.쉼표로 구분 된 텍스트 파일의 파이썬 병합

텍스트 파일 1 :

Apple, 0 
Pear, 1 
Orange, 0 

텍스트 파일 2 :

Apple, 1 
Pear, 1 
Orange, 1 
난 단지 왼쪽을 유지, 사이드 바이 사이드 방식으로 병합하고자하는

"열 ", 텍스트 파일 1의 두 텍스트 파일 모두 동일합니다. 즉, 다음 병합 텍스트 파일을 생성하려고합니다.

병합 된 텍스트 파일 :

Apple, 0, 1 
Pear, 1, 1 
Orange, 0, 1 

나는 --- 코드의 합리적 소량 --- 이러한 병합을 수행하는 방법을 찾기 위해 노력하고있어. 그러나 실제 문제에는 텍스트 파일이 여러 개있을 수 있습니다. 어떻게 이것을 파이썬에서 할 수 있습니까?

가정 :

  1. 모든 텍스트 파일 행의 정확히 같은 수있을 것이다.
  2. 모든 텍스트 파일은 쉼표로 구분 된 파일로 한 줄에 정확히 1 쉼표가 있습니다.
  3. 모든 텍스트 파일의 모든 행에 대해 쉼표 왼쪽의 값은 완전히 동일합니다.

답변

1

fileinput.in에 설치 그들은 자신의 디렉토리에있는 모든 경우에 당신이 fileinput 함수에 os.listdir 통과 할 수

from collections import OrderedDict 
d= OrderedDict() 

import fileinput 
with open("joined.txt","w") as f: 
    for line in fileinput.input(["file1.txt","file2.txt","file3.txt","file4.txt"]): 
     spl = line.strip().split(",") 
     d.setdefault(spl[0],[]) 
     d[spl[0]] += spl[1:] 
    for k,v in d.items(): 
     f.write("{} {}\n".format(k,",".join(v))) 

:

from collections import OrderedDict 
d= OrderedDict() 

import fileinput 
import os 

with open("joined.txt","w") as f: 
    for line in fileinput.input(os.listdir("path_to")): 
     spl = line.strip().split(",") 
     d.setdefault(spl[0],[]) 
     d[spl[0]] += spl[1:] 
    for k,v in d.items(): 
     f.write("{} {}\n".format(k,",".join(v))) 
목록을 취할 것 풋 파일은 순서 모든 값을 CONCAT하고 유지하기 위해 ordereddict를 사용하다

유일한 파일은 아니지만 패턴을 따라 glob을 사용할 수 있습니다.

import fileinput 
import os 
import glob 

with open("joined.txt","w") as f: 
    for line in fileinput.input(glob.glob("./file*.txt")): 
     spl = line.strip().split(",") 
     d.setdefault(spl[0],[]) 
     d[spl[0]] += spl[1:] 
    for k,v in d.items(): 
     f.write("{} {}\n".format(k,",".join(v))) 
1

나는 zip을 사용하여 동시에 걸을 수 있습니다.

첫째 : 일부 분할 및 포맷을 수행, 다음은 라인별로 진행

with open('text1.csv') as f1, open('text2.csv') as f2, open('merge.csv', 'w') as fOut: 
    for line1, line2 in zip(f1, f2): 
     name, val1 = line1.strip().split(',') 
     val2 = line2.strip().split(',')[1] 
     fOut.write('{}, {}, {}\n'.format(name, val1, val2)) 
+2

임의의 수의 파일로 확장하는 것은 약간 까다 롭습니다. –

+0

@ScottHunter 실제로 그렇습니다. 아무렇지도 않으면. OP의 유스 케이스를 고려할 때 가장 먼저 떠오른 점. – CoryKramer

2

csvkit 시도로 새 파일로 쓰는, 그것은 쉽게 사용할 수 있습니다 또한 명령 줄 유틸리티를 가지고 그런 다음

pip install csvkit 

:

csvjoin --outer file1.csv file2.csv 
관련 문제