如何将CSV中存储为字符串形式的tensor转换为tensor对象?
解决字符串形式Tensor转换为Tensor对象的问题
我有一个CSV文件,其中文档嵌入的Tensor是以字符串形式存储的,示例如下:
>>> data.loc[0]['Q_emd_list'] 'tensor([ 0.1210, -1.1949, 0.1806, ..., 0.3578, -0.1209, 0.4065])'
尝试用ast.literal_eval转换时触发错误:
ValueError: malformed node or string: <_ast.Call object at 0x7fbe6203f580>
问题原因
ast.literal_eval仅支持解析Python字面量(如列表、字典、数字等),而目标字符串是tensor(...)这种函数调用形式,不属于字面量范畴,因此无法解析。
解决方案
以下是几种可行的转换方法:
方法1:字符串提取+手动转换(安全可控)
通过正则提取括号内的数值列表,再转换为Tensor:
import torch import re # 从CSV中获取的字符串 tensor_str = data.loc[0]['Q_emd_list'] # 提取方括号内的内容 match = re.search(r'\[(.*)\]', tensor_str) if match: num_str = match.group(1) # 移除省略号(如果实际数据中是完整数值可跳过此步) num_str = num_str.replace('...', '') # 分割并转换为float列表 num_list = [float(num.strip()) for num in num_str.split(',') if num.strip()] # 转换为Tensor q_emd = torch.tensor(num_list)
方法2:使用eval(简单但有风险)
eval可以直接解析函数调用,但仅当你完全信任CSV内容时使用,避免恶意代码注入:
import torch tensor_str = data.loc[0]['Q_emd_list'] # 注意:仅适用于可信数据源 q_emd = eval(tensor_str)
方法3:正则提取所有数值(适配省略号场景)
直接提取字符串中所有数值,无需处理括号结构:
import torch import numpy as np import re tensor_str = data.loc[0]['Q_emd_list'] # 提取所有浮点数(包含正负) num_str_list = re.findall(r'-?\d+\.\d+', tensor_str) # 转换为numpy数组再转Tensor num_array = np.array([float(num) for num in num_str_list]) q_emd = torch.from_numpy(num_array)
方法对比
- 方法1:安全度最高,可灵活处理格式异常(如省略号),但需要手动处理字符串逻辑。
- 方法2:代码最简洁,但存在安全风险,禁止用于不可信数据源。
- 方法3:无需关注括号结构,直接提取数值,适合格式统一的场景。
内容的提问来源于stack exchange,提问作者AI Sush
相关产品推荐
相关产品推荐

