嵌套的for循环仅在第一次迭代时运行

时间:2019-08-12 19:20:30

标签: python nested-loops

我正在使用一个列表,并对照csv文件中保存的信息对此进行检查。我正在尝试一次执行一个列表项,但是在初始迭代之后,嵌套的for循环似乎没有运行。

我使用了初始的For循环,因此整个循环将运行与列表中的项目数相等的迭代数。然后,内部for循环运行csv文件中的行数。如果列表项与CSV行中的信息匹配,则非常内部的If语句将进行填充。

with open('MY_PATH', encoding="utf8") as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',') 
    line_count = 2
    for i in range(0, len(class_numbers)):
        for row in csv_reader:
            if obj_list[i]['name'] in row[1]:
                audiofile = '{}.mp3' .format(row[0][0:8])
                #audio = fetch_file(audiofile)
                print(row[1],'-' , audiofile)
                line_count += 1
            else:
                line_count += 1
                #print('error')

2 个答案:

答案 0 :(得分:2)

您的csv_reader是可迭代的,但不是序列。这意味着,一旦创建它,​​就只能对其进行一次迭代(如在for循环中一样)。在那之后,它就被耗尽了,任何进一步的迭代尝试都会将其视为空的。它一直是空的,直到销毁并重新创建。

您可以执行几项操作。您可以在每个循环上重新创建csv_reader。或者,您可以将该文件的内容存储到序列中,例如列表中,例如可以使用readlines。或者,您可以交换两个循环-首先循环csv_reader,然后在其中循环range(0, len(class_numbers))。或者,您可以通过csv_file.seek()重置阅读器(感谢@Barmar提供该选项。)每种方法都有其缺点。

答案 1 :(得分:0)

csv.reader对象只能迭代一次,然后迭代器耗尽,并且没有“重置”到csv开头的概念。

您最可能想做的是先将csv转换为列表,以便可以对其进行多次遍历:

with open('MY_PATH', encoding="utf8") as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    # turn csv_reader into a list of rows instead of a reader object
    cvs_rows = list(csv_reader) 
    line_count = 2
    for i in range(0, len(class_numbers)):
        # you can now iterate over the rows as many times as you like
        for row in csv_rows:
            if obj_list[i]['name'] in row[1]:
                audiofile = '{}.mp3' .format(row[0][0:8])
                #audio = fetch_file(audiofile)
                print(row[1],'-' , audiofile)
                line_count += 1
            else:
                line_count += 1
                #print('error')