python - 多次循环时,csv 字典不会重置到开头

标签 python csv

我正在循环一个 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/

相关文章:

mysql - 在 Rails/Heroku 上摄取巨大的 CSV : MySQL Connection Closed - SignalException: SIGTERM

python - 列中的多个分类变量和准备

python - Airflow DAG - 如何先检查 BQ(必要时删除)然后运行数据流作业?

python - 将数据传输到 excel 时如何处理 "old"日期

javascript - 在 d3.csv() 方法的回调函数中无法访问我的数据

csv - 并发写入csv : “slice bounds out of range”

powershell - 使用 Powershell 操作 CSV

python MPI sendrecv() 传递 python 对象

python - 很难理解 Bellman Ford 的迭代

php - Mysql 获取 unicode 文本(印地语)以记录集/文件 php codeigniter