如何将加载后的嵌套Python字典按指定格式写入CSV文件?
嵌套字典转指定格式CSV的解决方法
问题场景
你用np.save()保存了Python字典,加载时必须设置allow_pickle=True才能恢复,最终得到如下嵌套结构的字典:
values = {(0, 0, 0): {0: -1421.05, 1: -1578.94, 2: -1473.65, 3: -1471.21}, (0, 0, 1): {0: -142, 1: -157, 2: -147, 3: -147}, (0, 0, 2): {0: 19, 1: 15, 2: 10, 3: 12}}
想要把它导出成指定格式的CSV/文本文件:
0 1 2 3 (0,0,0):-1421.05,-1578.94,-1473.65,-1471.21 (0,0,1):-142, -157, -147, -147 (0,0,2):19, 15, 10, 12
但直接用pd.DataFrame(policy)再导出的代码会报错,或者输出完全不符合预期。
为什么原代码不行
直接把嵌套字典传给pd.DataFrame(),会把外层字典的键(比如(0,0,0))当成列名,内层字典的键(比如0、1、2、3)当成行索引,和你要的结构完全相反,自然出问题。
解决办法
方法1:用Pandas调整结构后导出
先把字典转成DataFrame,再转置调整行列,最后格式化索引:
import pandas as pd # 先转成DataFrame,此时外层键是列,内层键是行 df = pd.DataFrame(values) # 转置后,外层键变行索引,内层键变列 df = df.T # 把行索引改成"(x,y,z):"的格式 df.index = [f"{idx}:" for idx in df.index] # 如果要标准CSV格式(逗号分隔,对齐靠阅读器处理) df.to_csv('saved-policy.csv', index=True, header=True) # 如果要严格对齐的文本格式(和示例完全一致) formatted_content = df.to_string(header=True, index=True, col_space=10) with open('saved-policy.txt', 'w', encoding='utf-8') as f: f.write(formatted_content)
注:严格对齐的格式更偏向文本文件,标准CSV本身不负责显示对齐,只保证数据分隔。
方法2:手动写入(不依赖Pandas)
如果不想用Pandas,可以直接遍历字典构建每行内容,完全自定义格式:
# 获取列名(假设所有内层字典的键都一致) col_names = list(next(iter(values.values())).keys()) # 构建表头,前面加空格对齐 header = " " * 10 + ",".join(f"{col:>8}" for col in col_names) + "\n" # 构建每一行数据 rows = [] for outer_key, inner_dict in values.items(): row_head = f"{outer_key}:" row_vals = ",".join(f"{val:>8}" for val in inner_dict.values()) rows.append(row_head + row_vals + "\n") # 写入文件 with open('saved-policy.txt', 'w', encoding='utf-8') as f: f.write(header) f.writelines(rows)
这个方法能精准复刻你给出的示例格式。
内容的提问来源于stack exchange,提问作者Oluwaseyi Ogunfowora
相关产品推荐
相关产品推荐

