首页 > 解决方案 > Python嵌套了两个字典的For循环,内循环不重置

问题描述

我正在尝试比较两个 csv 文件之间的特定值。我使用该函数读取了两个 csv 文件,csv.DictReader()并且我有一个嵌套的 for 循环,每个循环都通过一个阅读器。当然,通常内部 for 循环将重置并在外部循环的每次迭代中遍历其整个循环,但对我而言并非如此。当使用我的调试器时,我可以在外循环的第二次迭代中看到,代码完全跳过了内循环,就好像没有任何东西可以循环一样。这是由于遍历字典阅读器对象的属性吗?如果是这样,我该如何解决?我在下面包含了我的代码片段。

with open('csv1.csv', 'r') as inFile1:
   with open('csv2.csv', 'r') as inFile2:
      reader1 = csv.DictReader(inFile1)
      reader2 = csv.DictReader(inFile2)

      for row1 in reader1:
         for row2 in reader2:
            if row1['key1'] == row2['key2']:
               [Perform other operations here]

标签: pythoncsvdictionaryfor-loop

解决方案


一旦你用尽了一个迭代器,它就不会自动重置。

相反,您必须为每个外部迭代提供一个新的内部迭代器。

with open('csv1.csv', 'r') as inFile1:
    reader1 = csv.DictReader(inFile1)

    for row1 in reader1:
        with open('csv2.csv', 'r') as inFile2:
            reader2 = csv.DictReader(inFile2)
            for row2 in reader2:
                if row1['key1'] == row2['key2']:
                    [Perform other operations here]

或者,如果文件大小合理,只需在处理文件之前将文件读入内存:

with open('csv1.csv', 'r') as inFile1, open('csv2.csv', 'r') as inFile2:
    csv1 = list(csv.DictReader(inFile1))
    csv2 = list(csv.DictReader(inFile2))
    
for dict1 in csv1:
    for dict2 in csv2:
        if dict1['key1'] == dict2['key2']:
            [Perform other operations here]                        

推荐阅读