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

Python读取CSV存入字典仅输出首行,后续内容丢失问题排查

问题分析与修复

你的代码主要有三个问题导致只能保留最后一行数据:

  1. 变量被重复覆盖:循环里每次都执行portfolio = [...],这会把之前存储的内容全部替换成当前行的列表,最终只剩最后一行。
  2. 表头读取方式错误:用next(f)直接操作文件对象,会打乱csv.reader的迭代逻辑,导致行读取错位。
  3. 数据类型混淆:你初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:07:45