Python读取CSV存入字典仅输出首行,后续内容丢失问题排查
问题分析与修复
你的代码主要有三个问题导致只能保留最后一行数据:
- 变量被重复覆盖:循环里每次都执行
portfolio = [...],这会把之前存储的内容全部替换成当前行的列表,最终只剩最后一行。 - 表头读取方式错误:用
next(f)直接操作文件对象,会打乱csv.reader的迭代逻辑,导致行读取错位。 - 数据类型混淆:你初始化
portfolio为字典,但循环里改成了列表,和注释里的字典结构逻辑矛盾。
修复方案1:用csv.reader构建字典(以name为键)
如果想把数据存在以股票名称为键的字典里,修正代码如下:
import csv def read_portfolio(filename): portfolio = {} with open(filename) as f: rows = csv.reader(f) # 用reader的next方法获取表头,避免和文件对象迭代冲突 headers = next(rows) for row in rows: # 给字典添加键值对,而非覆盖整个变量 portfolio[row[0]] = {'shares': int(row[1]), 'price': float(row[2])} return portfolio myportfolio = read_portfolio('portfolio.csv') print(myportfolio)
修复方案2:用csv.DictReader简化写法
csv.DictReader会自动把表头作为字典的键,无需手动处理索引,更直观:
import csv def read_portfolio(filename): portfolio = {} with open(filename) as f: rows = csv.DictReader(f) for row in rows: # 直接通过表头字段名访问,同时转换数据类型 portfolio[row['name']] = {'shares': int(row['shares']), 'price': float(row['price'])} return portfolio myportfolio = read_portfolio('portfolio.csv') print(myportfolio)
修复方案3:构建字典列表
如果想要的是包含所有行字典的列表(而非以name为键的大字典),修改如下:
import csv def read_portfolio(filename): portfolio = [] with open(filename) as f: rows = csv.reader(f) next(rows) # 跳过表头行 for row in rows: # 用append添加新行,避免覆盖 portfolio.append({'name': row[0], 'shares': int(row[1]), 'price': float(row[2])}) return portfolio myportfolio = read_portfolio('portfolio.csv') print(myportfolio)
额外说明
- CSV读取的所有内容默认是字符串类型,建议把
shares转为整数、price转为浮点数,方便后续的数值计算。 - 确保你的
portfolio.csv表头包含name、shares、price(或对应列的顺序正确),否则需要调整索引或字段名。
内容的提问来源于stack exchange,提问作者carrottop
相关产品推荐
相关产品推荐

