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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:20:26