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]
です。 (私はあなたのreader1
row
の各行を命名の慣習やreader2
line
の各行を保持している。)
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)です。数値型を比較しようとしている場合は、数値型に変換する必要があります。
'reader1'と' reader2'は一度だけファイルを通過します。だから、内部ループのために 'reader2'を使うとき、それは外側ループの最初の反復でしか動かないでしょう。その後、すべてが使い果たされてしまいます。しかし、あなたの外側のループの中に 'reader2'を繰り返し作成することでこれを修正しないでください。代わりにアルゴリズムを修正してください。 –