2017-10-10 109 views
1

我需要幫助連接基於常見字符串的兩個文本文件。Python文本文件比較和連接

我的第一個txt文件看起來是這樣的:

Hello abc 
Wonders xyz 
World abc 

我的第二個txt文件看起來是這樣的:

abc A 
xyz B 
abc C 

我希望我的輸出文件是:

Hello abc A 
Wonders xyz B 
World abc C 

我的代碼是這樣的:

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

但是,當我使用此代碼,我得到的輸出:

Hello abc A 
Wonders xyz B 
Hello abc C 

3號線不匹配的情況。我該怎麼做才能以正確的方式得到它?

回答

0

恐怕你錯了,你的代碼不會產生你所說的輸出。

部分原因是文件只能被讀取一次,不同的是如果將讀取光標移回文件的開頭(file.seek(0)docs)。

部分原因是第一個文件中行的第二個元素以換行符結尾,因此您正在比較​​與"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是第一個示例文件和file2是第二個)。如果我們談論巨大的文件(數百萬行),這個版本將比aarons更快。在其他情況下,性能差異可以忽略不計。

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