2017-05-15 5 views
0

の間の値を検索すると、次のコードはdata1ファイルの最初の行で停止します。値がcolomn 1とデータ22つのCSVファイルを使って、範囲python

with open('data1.csv', 'r') as f: 
    reader1 = csv.reader(f, delimiter=';') 
    with open('data2.csv', 'r') as d: 
     reader2 = csv.reader(d, delimiter=';') 
     for row in reader1: 
      for line in reader2: 
       if (row[0] == line[1]) and (line[2] <= row[1] <= line[3]): 
        print(line[0] + ' ' + row[1]) 
+2

'reader1'と' reader2'は一度だけファイルを通過します。だから、内部ループのために 'reader2'を使うとき、それは外側ループの最初の反復でしか動かないでしょう。その後、すべてが使い果たされてしまいます。しかし、あなたの外側のループの中に 'reader2'を繰り返し作成することでこれを修正しないでください。代わりにアルゴリズムを修正してください。 –

答えて

1

reader1とのみreader2の各行の2の範囲内にある場合

代わりに、DATA1の第2 colomnのすべての値をthrought行くとなるはずファイルを一度通過します。したがって、最初の行reader1を確認するためにreader2をすべて読むと、すべてが使い果たされます。別の行をreader1から調べようとすると、reader2から読み取る行がなくなります。

d.seek(0)の直前にfor line in reader2:という行を追加すると、ファイルポインタがファイルの先頭に戻されます。ファイルを処理する方法が非常に遅いため、これを行わないでください。

より良い方法は、reader2という行を、一致する可能性が高い行だけを反復するように保存することです。あなたの基準の1つがrow[0] == line[1]なので、reader2の行をキャッシュしました。line[1]です。 (私はあなたのreader1rowの各行を命名の慣習やreader2lineの各行を保持している。)

from collections import defaultdict 
reader2_by_item1 = defaultdict(list) 
with open('data1.csv', 'r') as f, open('data2.csv', 'r') as d: 
    reader1 = csv.reader(f, delimiter=';') 
    reader2 = csv.reader(d, delimiter=';') 
    for line in reader2: 
     reader2_by_item1[line[1]].append(line) 
    for row in reader1: 
     for line in reader2_by_item1[row[0]]: # this tests row[0] == line[1] 
      if (line[2] <= row[1] <= line[3]): 
       print(line[0] + ' ' + row[1]) 

注:line[2] <= row[1] <= line[3]この比較は、辞書編集(文字列comparisions)です。数値型を比較しようとしている場合は、数値型に変換する必要があります。

関連する問題