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

Nested for loop only runs on first iteration

我正在使用一个列表并将其与 csv 文件中保存的信息进行核对。我试图一次只处理一个列表项,但是在初始迭代之后,嵌套的 for 循环似乎没有 运行。

我使用了初始 For 循环,因此整个循环 运行 迭代次数等于列表中的项目数。内部 for 循环然后 运行s 用于 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')

你的 csv_reader 是一个可迭代的但不是序列。这意味着,一旦它被创建,它就只能被迭代一次(就像在你的 for 循环中一样)。在那之后,它就用完了,任何进一步的迭代尝试都会将它视为空的。在被销毁并重新创建之前,它一直是空的。

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

csv.reader objects 只能被迭代一次,然后迭代器被耗尽,它没有 "resetting" 回到 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')