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

Python中csv.DictReader对象遍历后为何变为空?

为什么csv.DictReader遍历一次后就为空?

这是因为csv.DictReader返回的是迭代器,而非可重复遍历的容器(比如列表)。迭代器的特性是:遍历过程中逐步生成元素,一旦遍历完成,指针就移动到序列末尾,没有剩余元素可供再次迭代,所以第二次循环时不会有任何输出。

你的代码里,country_dictionary就是这个迭代器对象,第一次for循环已经把所有行读取完毕,第二次循环自然无法获取内容。


解决方案1:将迭代器转为列表存储

把csv.DictReader生成的迭代器直接转为列表,列表支持多次遍历,所有数据会一次性加载到内存中,适合中小规模CSV文件。

修改后的代码:

import csv

def csv_to_dictionary(csv_name, delimiter):
    input_file = csv.DictReader(open(csv_name, 'r', encoding='utf-8'), delimiter=delimiter)
    return list(input_file)  # 转换为列表返回

country_dictionary = csv_to_dictionary("country.csv", ',')
country_list = []
for row in country_dictionary:
    print(row)
    country_list.append(row["Country Code"])
print(country_list)

for row in country_dictionary:
    print(row)  # 现在可以正常输出所有行

解决方案2:每次遍历重新创建迭代器

如果CSV文件体积较大,不想一次性加载所有数据,可以每次需要遍历的时候重新打开文件并创建csv.DictReader对象,这种方式内存占用低,但会增加文件IO操作次数。

示例代码:

import csv

def get_country_reader(csv_name, delimiter):
    return csv.DictReader(open(csv_name, 'r', encoding='utf-8'), delimiter=delimiter)

# 第一次遍历
country_list = []
for row in get_country_reader("country.csv", ','):
    print(row)
    country_list.append(row["Country Code"])
print(country_list)

# 第二次遍历
for row in get_country_reader("country.csv", ','):
    print(row)  # 重新读取文件并输出内容

解决方案3:提前保存迭代器内容

在第一次遍历前,把迭代器的所有元素保存到列表中,后续遍历直接使用这个列表:

import csv

def csv_to_dictionary(csv_name, delimiter):
    input_file = csv.DictReader(open(csv_name, 'r', encoding='utf-8'), delimiter=delimiter)
    return input_file

country_reader = csv_to_dictionary("country.csv", ',')
country_data = list(country_reader)  # 保存所有行到列表

country_list = []
for row in country_data:
    print(row)
    country_list.append(row["Country Code"])
print(country_list)

for row in country_data:
    print(row)  # 遍历保存好的列表内容

内容的提问来源于stack exchange,提问作者3nondatur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:43:24