使用eval转换含numpy数组的字典字符串时触发NameError求助
解决CSV导入后含numpy array的字典字符串无法eval的问题
问题原因
CSV存储时会将字典转为字符串,但numpy array的字符串表示是array([...]),而eval执行时默认命名空间里没有array这个名称(它是numpy.array的简写),所以触发NameError。
解决方法
方法1:给eval补充命名空间
直接在eval的全局参数中指定array对应numpy.array,让eval能识别这个名称:
import numpy as np # 假设从CSV读取到的损坏字符串是这个 dict_str = "{'values': array([1, 3, 5]), 'label': 'sample'}" restored_dict = eval(dict_str, {'array': np.array})
方法2:替换字符串后再解析(更安全的预处理)
先把字符串里的array(替换为np.array(,再结合命名空间解析,同时用正则精准避免误替换:
import numpy as np import re dict_str = "{'values': array([1, 3, 5]), 'label': 'sample'}" # 匹配独立的array关键字并替换 processed_str = re.sub(r'\barray\(', 'np.array(', dict_str) restored_dict = eval(processed_str, {'np': np})
注:
ast.literal_eval虽然比eval安全,但它只支持Python内置字面量类型,无法识别函数调用,所以这种场景下还是需要用eval,通过限制命名空间降低风险。
方法3:从根源优化存储方式(推荐)
避免直接把字典存为字符串,改用JSON序列化(需先将numpy array转为列表),彻底避免解析问题:
保存时:
import json import numpy as np import pandas as pd original_dict = {'values': np.array([1, 3, 5]), 'label': 'sample'} # 将numpy数组转为可序列化的列表 serializable_dict = { k: v.tolist() if isinstance(v, np.ndarray) else v for k, v in original_dict.items() } # 转为JSON字符串 json_str = json.dumps(serializable_dict) # 写入CSV pd.DataFrame({'data_col': [json_str]}).to_csv('saved_data.csv', index=False)
读取时:
import json import numpy as np import pandas as pd df = pd.read_csv('saved_data.csv') # 解析JSON字符串 restored_dict = json.loads(df['data_col'][0]) # 将列表转回numpy数组 restored_dict['values'] = np.array(restored_dict['values'])
内容的提问来源于stack exchange,提问作者Nitsan
相关产品推荐
相关产品推荐

