2016-09-21 6 views
1

したがって、あるファイルのある行の値を別のファイルと一致するように合計/分析したいとします。 私はと比較したい最初のファイルの形式は次のとおりです。Pythonの2つのtsvファイルの行の部分を比較します

Acetobacter cibinongensis Acetobacter Acetobacteraceae  
Rhodospirillales Proteobacteria Bacteria  
Acetobacter ghanensis Acetobacter Acetobacteraceae Rhodospirillales Proteobacteria Bacteria  
Acetobacter pasteurianus Acetobacter Acetobacteraceae Rhodospirillales Proteobacteria Bacteria 

そして第二に、ファイルが似ている:私は何をしたいか

Blochmannia endosymbiont of Polyrhachis (Hedomyrma) turneri Candidatus Blochmannia Enterobacteriaceae Enterobacteriales Proteobacteria Bacteria 1990 7.511 14946.9 
Blochmannia endosymbiont of Polyrhachis (Hedomyrma) turneri Candidatus Blochmannia Enterobacteriaceae Enterobacteriales Proteobacteria Bacteria 2061 6.451 13295.5 
Calyptogena okutanii thioautotrophic gill symbiont Proteobacteria-undef Proteobacteria-undef Proteobacteria-undef Proteobacteria Bacteria 7121 2.466 17560.4 

は、最初のファイル内のすべての行を解析し、最初の6つのフィールドが一致する2番目のファイルのすべての行について、種情報に続く3つのフィールドの番号の分析を実行します。次のように

私のコードは次のとおりです。私は私の最初のファイルからの行と種が第二のファイルで見つかった回数を与える願ってい

with open('file1', 'r') as file1: 
with open('file2', 'r') as file2: 
    for line in file1: 
     count = 0 
     line = line.split("\t") 
     for l in file2: 
      l = l.split("\t") 
      if l[0:6] == line[0:6]: 
       count+=1 
     count = str(count) 
     print line + '\t' + count +'\t'+'\n' 

。 私はおそらくこの分析の特定の部分を行うためのより良い方法があることを知っていますが、私は目的の簡単な例を挙げたいと思いました..とにかく、私は一致を得ることはありません、 0:6] == line [0:6] はTrueです。 アイデアは何ですか? :-S

答えて

0

最初の反復でfile2を消費するという根本的な原因があるため、常に何も繰り返しません。

クイックフィックス:file2を完全に読み込んでリストに入れます。しかし、これは速度(O(N^2):double loop)に関してはむしろ非効率的である。 6つの最初の値のkey = tupleを持つ辞書を作成する方が良いでしょう。セパレータはあなたに将来的にいくつかの驚きを避けるだろうと

with open('file2', 'r') as f: 
    file2 = list(f) 
with open('file1', 'r') as file1: 

    for line in file1: 
     count = 0 
     line = line.split("\t") 
     for l in file2: 
      l = l.split("\t") 
      if l[0:6] == line[0:6]: 
       count+=1 
     count = str(count) 
     print line + '\t' + count +'\t'+'\n' 

また、TABで構成csvモジュールを使用しました。

より良いバージョン、(最初の6つの要素が重要です、それは可変ですが、我々はtupleに変換する必要があるため、我々はキーとしてlistを使用できないことに注意してください)file2のデータに高速アクセスのための辞書を使用して:

d = dict() 

# create the dictionary from file2 
with open('file2', 'r') as file2: 
    for l in file2: 
     fields = l.split("\t") 
     d[tuple(fields[0:6])] = fields[6:] 

# iterate through file1, and use dict lookup on data of file2 
# much, much faster if file2 contains a lot of data 

with open('file1', 'r') as file1: 

    for line in file1: 
     count = 0 
     line = line.split("\t") 

     if tuple(line[0:6]) in d: # check if in dictionary 
      count+=1 
      # we could extract the extra data by accessing 
      # d[tuple(line[0:6])] 
     count = str(count) 
     print(line + '\t' + count +'\t'+'\n') 
+0

これは素晴らしく、とてもうまく説明されました。ありがとうJean-Francois! – regant

関連する問題