如何将多个CSV数据追加到字典?现有代码仅读取单个文件
问题排查与解决建议
问题原因
你当前代码的核心问题是缩进错误:遍历DictReader_obj的for循环写在了with open代码块的外面。当with块执行完毕后,文件会被自动关闭,此时DictReader_obj依赖的文件流已经失效,只有最后一次循环创建的DictReader_obj可能读取到内容,最终导致只能获取单个CSV文件的数据。
另外,你初始化的list_df是列表结构,和你期望的「按Symbols分组的嵌套结构」不匹配,需要调整数据组织方式。
修正后的代码实现
以下代码会读取所有CSV文件,并将数据整理成以Symbols为键、对应行情数据列表为值的字典结构,符合你期望的格式:
from csv import DictReader import glob # 初始化目标字典:键为Symbols,值为该标的的所有行情数据列表 symbol_data = {} # 获取所有CSV文件路径(根据实际路径调整glob规则) csvfiles = glob.glob("*.csv") for csvfile in csvfiles: with open(csvfile, 'r') as f: # 指定字段名创建DictReader reader = DictReader(f, fieldnames=['Symbols', 'Date', 'Open', 'High', 'Low', 'Close', 'Volumn']) # 遍历每一行数据,注意跳过表头(如果CSV本身有表头的话) for row in reader: # 跳过空行或无效行(可选,根据你的CSV情况调整) if not row['Symbols']: continue symbol = row['Symbols'] # 移除Symbols字段,只保留行情数据 price_data = {k: v for k, v in row.items() if k != 'Symbols'} # 若该标的已在字典中,追加数据;否则新建列表 if symbol in symbol_data: symbol_data[symbol].append(price_data) else: symbol_data[symbol] = [price_data] # 打印整理后的结果示例 for symbol, data_list in symbol_data.items(): print(f"{symbol}") for data in data_list: print(f" {data['Date']} {data['Open']} {data['High']} {data['Close']} {data['Volumn']}")
额外说明
- 如果你的CSV文件本身已经包含表头,记得在创建
DictReader时去掉fieldnames参数,或者添加逻辑跳过表头行,避免表头被当作数据读取。 - 代码中加入了空行/无效行的判断,你可以根据实际CSV的格式调整过滤逻辑。
- 最终的
symbol_data字典结构为:{symbol: [{'Date': 'xx/xx/xxxx', 'Open': 'xxx.xx', ...}, ...], ...},完全匹配你期望的分组展示需求。
内容的提问来源于stack exchange,提问作者tachyon
相关产品推荐
相关产品推荐

