为何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
相关产品推荐
相关产品推荐

