2017-10-10 14 views
1

一般的な文字列に基づいて2つのテキストファイルを連結する際に助けが必要です。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]) 

しかし、私はこのコードを使用する場合、私はのような出力を得る:3不一致が発生

Hello abc A 
Wonders xyz B 
Hello abc C 

ライン。私はそれを正しい方法で得るために何をすべきですか?

答えて

0

私はあなたが間違っていると思いますが、あなたのコードはあなたが言う出力を生成しません。

一部のファイルは、読み込みカーソルをファイルの先頭(file.seek(0)docs)に戻した場合にのみ、1回だけ読み取ることができるためです。

部分的に、最初のファイルの行の2番目の要素が改行文字で終了するため、たとえば、​​と"abc\n"などは決して真実ではありません。

したがって、出力ファイルは完全に空になります。

どのように問題を解決しますか?ファイルを2回以上読むことは、過度に複雑に思われますが、そうしないでください。私はあなたの例の入力でそれをテストしてみたし、それが(file1がファイルとfile2が第二である第一の例です)正しい出力を生成

# 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 

:私はあなたの線に沿って何かを示唆しています。巨大なファイル(数百万行)について話すと、このバージョンはaaronsよりかなり高速になります。他のケースでは、パフォーマンスの差はごくわずかです。

0

openストリームは安全ではなく、ファイルは1回しか読み取れません。これを行う:

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

関連する問題