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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:20:15