2016-11-07 9 views
2

別のファイルの内容を使用して1つのファイルの内容をサブセット化しようとしています。 file1が行ごとに単一の値が含まれています別のファイルの内容に基づく1つのファイルのサブセットの内容

43 48 
43 54 
44 12 
88 55 
101 31 
101 56 
101 61 

Iの内容に基づいて、ファイル2の内容をフィルタリングしたい:

43 
44 
101 

File2のラインごとに2つの値が含まれて、値は、単一のスペースで分離されていますFile2の任意の行の最初の値がFile1の任意の値と一致する場合、File2からの行が新しいファイルに出力されるように、File1の値が変更されます。 File2の一部の行は新しいファイルに含まれてはいけません(値はFile1には存在しません)。また、File1の値の中にはFile2に複数のエントリがあります。出力は次のようになります。

43 48 
43 54 
44 12 
101 31 
101 56 
101 61 

私はこの作業のためにPythonで作業しようとしています。私は、この言語には比較的新しいですが、ここで私がこれまで試してみました何のいくつかは次のとおりです。このコードを機能させる方法について

output=open("new_file.txt","a") 

for i in file2: 
    key="%s" % (i.split()[0]) 
    if key in file1: 
     output.write(i) 

任意のアドバイスはありますか?ありがとう!

+0

ヒント:最初にfile1をロードし、データをO(1)ルックアップ(おそらくセットまたはディクショナリ)に入れ、file2の各行に対して(1)スペースを空けて行を分割し、あなたのセット/辞書にあります、(3)そうなら、出力ファイルに書きます。 –

答えて

0

まず、(このコードは、文字列ではなく数値としてそれらを維持しますが、それは大部分は無関係です)セットに最初のファイル内の数字のすべてを作るためのいくつかのロジックを実装:

nums = set() 
with open("file1.txt") as file1: 
    for line in file1: 
     nums.add(line.strip()) 

次に、我々は2番目のファイルの各行をフィルタリングするためのコードがあります。我々は、同時に最終ファイルに出力することもできますし、すべてを一時的に保存して後で行うこともできます。このコードは、同時にそれを行います:

with open("file2.txt") as file2, open("output.txt", "wt") as output: 
    for line in file2: 
     to_check = line.strip().split()[0] 
     if to_check in nums: 
      print(line.strip(), file=output) 

そしてそれはトリックを行う必要があります。私はあなたが提供したものでそれをテストしました、そして、あなたが望む結果を与えるようですが、あなたが期待していることをしていないかどうか私に教えてください。

+0

これは完璧に動作します。このコードは論理的にも意味があります。再度、感謝します! – nrcombs

+0

@nrcombs問題ありません!それがあなたを助けた場合、これを正解としてマークしてもよろしいですか? – user3030010

0

私はリストとネストされたリストの中に第二のファイルに最初のファイルを読み出し、この

with open('file1.txt') as f1: 
    set1 = [line.strip() for line in f1] 

with open('file2.txt') as f2: 
    vals = [[val for val in line.split()] for line in f2] 

with open('out.txt', 'w') as fout: 
    for val in vals:   
     if val[0] in set1: 
      fout.write(' '.join(val) + '\n') 

ようにそれを行うだろう。最初のエントリがファイル1のリストに含まれているかどうかを調べるfile2値をループします。多くの値を処理した場合、set1setを線形から定数へルックアップすることができます。少数の値については、オーバーヘッドの価値はないかもしれません。

+0

素晴らしい、素晴らしい作品です。レスポンスありがとう!このタスクへの複数のアプローチを参照するのに役立ちます。 – nrcombs

+0

素晴らしいあなたの好みの答えを選んで、それを合格とマークすることを忘れないでください。 –

関連する問題