我正在循环一个 CSV 文件,该文件作为字典打开。问题是,当我循环字典中的行时,主 for
循环转到下一个项目。运行 for
循环时,字典不会重置为第一项。因此,如果到达最后一行,它不会改变。
names = ['a', 'b', 'c', 'd', 'e', 'f']
source1_csv = open("output.csv", mode='r')
dictionary_csv = csv.DictReader(source1_csv)
for letters in names:
for entry in dictionary_csv:
print(entry["name"])
if entry['name'] == letters:
print("found it")
您可以使用任何 CSV 文件,只需替换 entry
中的键,并注意,如果外部 for
循环没有匹配项,则下一个选择 names
中的项目,字典的内部 for 循环将退出,因为字典已经位于最后一个位置并且不会重置。
如何避免这种情况,以便重置字典的位置并解析名称列表中每个条目的每一行?
最佳答案
解决方案 1:
从上面的代码来看,您似乎不需要多次迭代整个 csv,您只需切换循环即可:
for entry in dictionary_csv:
for letters in names:
print(entry["name"])
if entry['name'] == letters:
print("found it")
将 dictionary_csv
上的循环切换到外循环将避免多次循环 csv。
解决方案 2:
但是,如果您不想更改循环顺序,则可以在自己使用之前将 DictReader
转换为 list
。这样,list
将使用 reader,并返回它的列表,并且您可以多次迭代它:
dictionary_csv = list(csv.DictReader(source1_csv))
但是如果您的 csv 相当大,则不建议从中创建列表,因为列表大小会很大。
解决方案 3:
除了创建列表之外,您还可以在内部循环之前将源文件 source1_csv
查找为 0:
for letters in names:
source1_csv.seek(0)
for entry in dictionary_csv:
print(entry["name"])
if entry['name'] == letters:
print("found it")
它将从源文件开始,dictionary_csv
将为您再次读取它。
编辑:
正如 @merlyn 在下面的评论中指出的那样,解决方案 3 不会完全正确工作,因为在查找 0 后,dictionary_csv
会将 csv 的第一行(标题)解释为单独的行数据行。因此,在查找 0 后,您必须忽略一行。
source1_csv.seek(0)
source1_csv.readline()
或者,每次查找 source1_csv
时重新实例化 dictionary_csv
(为此,您可以在下面查看 @merlyn 的答案)。
关于python - 多次循环时,csv 字典不会重置到开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53313567/