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

