将包含numpy数组的dict写入CSV后,如何还原得到原始dict
解决方案
场景1:已有生成的CSV文件,需要还原原始dict
你当前CSV中存储的是numpy数组的repr字符串,可以通过ast.literal_eval配合numpy构造函数解析,操作步骤如下:
- 导入所需依赖:
import csv import ast import numpy as np
- 读取解析代码:
rebuild_dict = {} # 定义解析时允许识别的关键字,适配numpy数组的repr格式 eval_globals = { 'array': np.array, 'float32': np.float32, # 如有其他数据类型可在此补充,比如float64、int32等 } with open('file.csv', 'r', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: # 转换第一列的数值键为int类型 key = int(row[0]) # 解析第二列的字典字符串 value_dict = ast.literal_eval(row[1], globals=eval_globals) rebuild_dict[key] = value_dict
注意:ast.literal_eval仅会解析字面量结构,不会执行恶意代码,安全性远高于原生eval,自有生成的CSV可以放心使用
场景2:调整存写逻辑,避免后续解析麻烦
你之前直接把嵌套字典转字符串存CSV的方式本身不符合CSV规范,推荐两种更可靠的实现方案:
方案A:保留CSV格式,调整存储结构
把数组展开存储,兼容其他CSV工具的读取需求:
# 存写代码 import csv import numpy as np with open('file.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) # 写入表头 writer.writerow(['xplane', 'field', 'array_data']) for xplane, field_dict in dict_data.items(): for f_name, arr in field_dict.items(): # 把numpy数组转成逗号分隔字符串存储 arr_str = ','.join(map(str, arr.tolist())) writer.writerow([xplane, f_name, arr_str]) # 读取还原代码 rebuild_dict = {} with open('file.csv', 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: xplane = int(row['xplane']) f_name = row['field'] arr = np.array(list(map(float, row['array_data'].split(','))), dtype=np.float32) if xplane not in rebuild_dict: rebuild_dict[xplane] = {} rebuild_dict[xplane][f_name] = arr
方案B:使用专用序列化工具,无兼容性问题
如果不需要用其他工具打开文件,直接用pickle序列化更简单,还原后和原始数据100%一致:
# 存写代码 import pickle with open('data.pkl', 'wb') as f: pickle.dump(dict_data, f) # 读取还原代码 with open('data.pkl', 'rb') as f: rebuild_dict = pickle.load(f)
内容的提问来源于stack exchange,提问作者ATK
相关产品推荐
相关产品推荐

