我正在使用一个列表,并对照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')
答案 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')