以下代码在data1文件的第一行停止。
相反,它应该遍历data1的第二个colomn的所有值,并查看该值是否在每行数据2的colomn 1和2的范围内
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])
答案 0 :(得分:1)
reader1
和reader2
只能浏览一次文件。因此,当您通读所有reader2
以检查第一行reader1
时,它会全部用尽。当您尝试检查reader1
中的另一行时,不再需要从reader2
读取行。
一个天真的修复方法是将d.seek(0)
放在行for line in reader2:
之前,它会将文件指针重置回文件的开头。不要这样做,因为处理文件的速度很慢。
更好的方法是以这样的方式存储reader2
的行,使得您只迭代可能匹配的行。由于您的某个条件为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]
注意: var ProG = [[1,0,0,0],[1,0,0,0],[0,0,1,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]];
此比较是词典(字符串比较)。如果您要比较数字类型,则需要将它们转换为数字类型。