Python 3.10中csv.DictReader读取CSV仅首个列表有值其余为空
问题原因及解决方案
核心问题
你遇到的问题根源在于**csv.DictReader返回的是迭代器类型**,迭代器的特性是只能被完整遍历一次。当第一个列表生成器遍历完csv_file后,这个迭代器就已经耗尽,后续的列表生成器再去遍历它时,不会返回任何数据,所以key2、key3、key4对应的列表都是空的。
解决方案
方案1:先缓存所有数据到列表(适合中小文件)
先把CSV的所有行数据一次性读取到列表中,之后基于这个列表生成各个键对应的内容,这样可以多次遍历数据:
import numpy as np import csv with open(file,'r') as fl: csv_file = csv.DictReader(fl) # 将迭代器转换为列表,缓存所有行数据 all_rows = list(csv_file) fdata = { 'key1': [row['THING'] for row in all_rows], 'key2': [f"{row['STR1']}, {row['STR2']}, {row['STR3']}" for row in all_rows], 'key3': [np.array([row['FL1'], row['FL2']], dtype=float) for row in all_rows], 'key4': [int(row['POPULATION']) for row in all_rows] }
方案2:逐行遍历填充列表(适合大文件,内存友好)
只遍历一次csv_file,在循环中同时填充各个键对应的列表,避免一次性加载所有数据到内存:
import numpy as np import csv with open(file,'r') as fl: csv_file = csv.DictReader(fl) key1_list = [] key2_list = [] key3_list = [] key4_list = [] for row in csv_file: key1_list.append(row['THING']) key2_list.append(f"{row['STR1']}, {row['STR2']}, {row['STR3']}") key3_list.append(np.array([row['FL1'], row['FL2']], dtype=float)) key4_list.append(int(row['POPULATION'])) fdata = { 'key1': key1_list, 'key2': key2_list, 'key3': key3_list, 'key4': key4_list }
内容的提问来源于stack exchange,提问作者Carlos Martinez
相关产品推荐
相关产品推荐

