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
相关产品推荐
相关产品推荐

