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

Python中多同键字典写入CSV仅单条生效的解决求助

问题描述

我尝试用Python把两个键结构相同的独立字典写入CSV文件,字典内容如下:

{'instrumentType': 'Stock Futures', 'expiryDate': '25-Jan-2023', 'optionType': '-', 'strikePrice': 0, 'identifier': 'FUTSTKTATASTEEL25-01-2023XX0.00', 'openPrice': 119.85, 'highPrice': 120.9, 'lowPrice': 118.3, 'closePrice': 119, 'prevClose': 119.8, 'lastPrice': 119.3, 'change': -0.5, 'pChange': -0.41736227045075125, 'numberOfContractsTraded': 13024, 'totalTurnover': 85557.26}
{'instrumentType': 'Stock Options', 'expiryDate': '25-Jan-2023', 'optionType': 'Call', 'strikePrice': 120, 'identifier': 'OPTSTKTATASTEEL25-01-2023CE120.00', 'openPrice': 4.1, 'highPrice': 4.7, 'lowPrice': 3.25, 'closePrice': 3.5, 'prevClose': 4.1, 'lastPrice': 3.55, 'change': -0.5499999999999998, 'pChange': -13.414634146341461, 'numberOfContractsTraded': 11663, 'totalTurnover': 2501.71}

我用了下面的代码,但CSV里只存储了一个字典:

data = pd.DataFrame.from_dict(ce_dt)
data.to_csv('out.csv', index=False)

补充说明:变量中的字典之间没有用逗号分隔,这是导致仅写入一个字典的原因。示例数据如下:

{'underlying': 'MARUTI', 'identifier': 'OPTSTKMARUTI25-01-2023CE8500.00', 'instrumentType': 'OPTSTK', 'instrument': 'Stock Options', 'contract': 'MARUTI 25-Jan-2023', 'expiryDate': '25-Jan-2023', 'optionType': 'Call', 'strikePrice': 8500, 'lastPrice': 143, 'change': 13.55, 'pChange': 10.47, 'volume': 1870200, 'totalTurnover': 306581886, 'value': 306581886, 'premiumTurnOver': 16203281886, 'underlyingValue': 8419, 'openInterest': 2798, 'noOfTrades': 18702, 'meta': {'symbol': 'MARUTI', 'companyName': 'Maruti Suzuki India Limited', 'industry': 'AUTOMOBILES - 4 WHEELERS', 'activeSeries': ['EQ'], 'debtSeries': [], 'tempSuspendedSeries': ['IL'], 'isFNOSec': True, 'isCASec': False, 'isSLBSec': True, 'isDebtSec': False, 'isSuspended': False, 'isETFSec': False, 'isDelisted': False, 'isin': 'INE585B01010'}}
{'underlying': 'RELIANCE', 'identifier': 'OPTSTKRELIANCE25-01-2023CE2600.00', 'instrumentType': 'OPTSTK', 'instrument': 'Stock Options', 'contract': 'RELIANCE 25-Jan-2023', 'expiryDate': '25-Jan-2023', 'optionType': 'Call', 'strikePrice': 2600, 'lastPrice': 25.95, 'change': -14.3, 'pChange': -35.53, 'volume': 4438500, 'totalTurnover': 130269975, 'value': 130269975, 'premiumTurnOver': 11670369975, 'underlyingValue': 2516.65, 'openInterest': 15109, 'noOfTrades': 17754, 'meta': {'symbol': 'RELIANCE', 'companyName': 'Reliance Industries Limited', 'industry': 'REFINERIES', 'activeSeries': ['EQ'], 'debtSeries': [], 'tempSuspendedSeries': [], 'isFNOSec': True, 'isCASec': False, 'isSLBSec': True, 'isDebtSec': False, 'isSuspended': False, 'isETFSec': False, 'isDelisted': False, 'isin': 'INE002A01018'}}
解决方案

问题核心是你传入pd.DataFrame.from_dict()的是单个字典,而非包含多个字典的列表。需要先将多个字典整理为列表,再生成DataFrame。

情况1:字典为独立变量

如果两个字典分别存储在变量中(比如dict1和dict2),直接将它们放入列表即可:

import pandas as pd

# 定义两个字典变量
dict1 = {'instrumentType': 'Stock Futures', ...}
dict2 = {'instrumentType': 'Stock Options', ...}

# 将字典存入列表
data_list = [dict1, dict2]
# 生成DataFrame并写入CSV
data = pd.DataFrame.from_dict(data_list)
data.to_csv('out.csv', index=False)

情况2:字典为无逗号分隔的字符串形式

如果字典是以文本字符串形式存在(比如从文件/接口获取的内容,两个字典间无逗号),需先解析为字典列表:

import pandas as pd
import ast

# 假设原始文本内容为text
text = """{'instrumentType': 'Stock Futures', ...}
{'instrumentType': 'Stock Options', ...}"""

# 按换行分割并过滤空行,逐个解析为字典
dict_strings = [s.strip() for s in text.split('\n') if s.strip()]
data_list = [ast.literal_eval(s) for s in dict_strings]

# 生成DataFrame并写入CSV
data = pd.DataFrame(data_list)
data.to_csv('out.csv', index=False)

额外注意事项

  • 若部分字典存在缺失键,pandas会自动填充NaN,确保CSV列结构完整;
  • 若字典包含嵌套结构(如示例中的meta字段),想要展开嵌套字段,可使用pd.json_normalize()替代pd.DataFrame.from_dict():
data = pd.json_normalize(data_list)
data.to_csv('out.csv', index=False)

内容的提问来源于stack exchange,提问作者Wanabee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:35:34