You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何csv.DictReader无法多次迭代?第二次遍历结果为空

问题:csv.DictReader第二次遍历返回空列表

场景重现

CSV文件的逻辑结构如下:

{'name': 'Alice', 'AGATC': '2', 'AATG': '8', 'TATC': '3'}
{'name': 'Bob', 'AGATC': '4', 'AATG': '1', 'TATC': '5'}
{'name': 'Charlie', 'AGATC': '3', 'AATG': '2', 'TATC': '5'}

编写的Python代码:

import sys
import csv

with open(sys.argv[1], "r") as csv_file:
    csv_reader = csv.DictReader(csv_file)
    
    names = []

    for row in csv_reader:
        names.append(row["name"])
    print(names)

    agatc = []

    for row in csv_reader:
        agatc.append(row["AGATC"])
    print(agatc)

得到的输出:

['Alice', 'Bob', 'Charlie']
[]

原因分析

csv.DictReader本质是基于文件对象的迭代器,迭代器的核心特性是只能被遍历一次。第一次遍历csv_reader时,文件指针已经移动到文件末尾,第二次遍历自然没有剩余内容可读取,因此返回空列表。

解决方案

有两种高效的处理方式:

方式1:提前将所有数据转为列表存储

把csv_reader的内容一次性转换为列表,后续可多次遍历该列表:

import sys
import csv

with open(sys.argv[1], "r") as csv_file:
    csv_reader = csv.DictReader(csv_file)
    # 将迭代器转为列表,保存所有行数据
    rows = list(csv_reader)
    
    names = [row["name"] for row in rows]
    print(names)

    agatc = [row["AGATC"] for row in rows]
    print(agatc)

方式2:一次遍历收集所有需要的数据

在单次遍历过程中同时提取多个字段,避免重复遍历迭代器:

import sys
import csv

with open(sys.argv[1], "r") as csv_file:
    csv_reader = csv.DictReader(csv_file)
    
    names = []
    agatc = []

    for row in csv_reader:
        names.append(row["name"])
        agatc.append(row["AGATC"])
    
    print(names)
    print(agatc)

内容的提问来源于stack exchange,提问作者BjörnEriksson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:10:47