2017-10-10 4 views
1

공통 문자열을 기반으로 두 텍스트 파일을 연결하는 데 도움이 필요합니다.파이썬 텍스트 파일 비교 및 ​​연결

내 첫 txt 파일은 다음과 같습니다

Hello abc 
Wonders xyz 
World abc 

을 그리고 내 두 번째 txt 파일은 다음과 같습니다

abc A 
xyz B 
abc C 

나는 내 출력 파일이 원하는 :

Hello abc A 
Wonders xyz B 
World abc C 

내 코드는 다음과 같이 바뀝니다.

불일치가 발생

Hello abc A 
Wonders xyz B 
Hello abc C 

라인 :이 코드를 사용할 때 10

a = open("file1","r") 
b = open("file2","r") 
c = open("output","w") 

for line in b: 
    chk = line.split(" ") 

    for line_new in a: 
    chk_new = line_new.split(" ") 

    if (chk_new[0] == chk[1]): 
     c.write(chk[0]) 
     c.write(chk_new[0]) 
     c.write(chk_new[1]) 

는, 나는 같은 출력을 얻을. 올바른 방법을 얻으려면 어떻게해야합니까?

답변

0

실수로 코드가 출력되는 것은 아닙니다. 이 파일 (file.seek(0), docs)의 시작으로 다시 읽기 커서를 이동하면 파일이 유일한 예외가되는으로, 한 번에 읽을 수 부분적으로 있기 때문에

.

부분적으로 첫 번째 파일의 한 줄의 두 번째 요소가 개행 문자로 끝나기 때문에 예를 들어 "abc""abc\n" 등은 결코 사실이 아닙니다.

따라서 출력 파일은 완전히 비어 있습니다.

그래서 어떻게 문제를 해결합니까? 한 번 이상 파일을 읽는 것은 지나치게 복잡해 보이지만 그렇게하지 마십시오. 나는 당신의 예 입력에 그것을 테스트했습니다

# open all the files simultaneously 
with open('file1', 'r') as (f1 
), open('file2', 'r') as (f2 
), open('output', 'w') as (outf 
): 
    lines_left = True 

    while lines_left: 
     f1_line = f1.readline().rstrip() 

     # check if there's more to read 
     if len(f1_line) != 0: 

      f1_line_tokens = f1_line.split(' ') 

      # no need to strip the line from the second file 
      f2_line_tokens = f2.readline().split(' ') 

      if f1_line_tokens[1] == f2_line_tokens[0]: 
       outf.write(f1_line + ' ' + f2_line_tokens[1]) 
     else: 
      lines_left = False 

와 (파일 1은 첫 번째 예제 파일과 파일 2 번째입니다) 올바른 출력을 생성 : 나는 당신의 라인을 따라 뭔가를 제안한다. 거대한 파일 (수백만 줄)에 관해 이야기하면이 버전은 아론보다 훨씬 빠릅니다. 다른 경우에는 성능 차이가 미미합니다.

0

open 스트림은 안전하지 않으므로 한 번만 파일을 읽을 수 있습니다. 다음을 수행하십시오 :

aLines = [] 
bLines = [] 

with open("file1","r") as a: 
    for line in a: 
     aLines.append(line.strip().split(" ")) 

with open("file2","r") as b: 
    for line in b: 
     bLines.append(line.strip().split(" ")) 

bLines.reverse() 

with open("output","w") as c: 
    for chk in aLines: 
     chk_new = bLines.pop() 
     if chk_new[0] == chk[1]: 
      c.write(chk[0]) 
      c.write(chk_new[0]) 
      c.write(chk_new[1]) 
+0

입력 해 주셔서 감사합니다. 하지만 제 관심사는 첫 번째 인스턴스가 첫 번째 줄에서 맞았 기 때문에 문자열 일치가 시트의 시작 부분에서 값을 가져 오는 것입니다. – user8753436

+0

이제 텍스트 파일을 사전 요소로 변환하려고합니다. 귀하의 의견을 보내 주셔서 감사합니다 :) – user8753436