ast.literal_eval()在转换带有array()列表的字符串时格式错误的节点或字符串

时间:2018-05-29 17:22:20

标签: python numpy abstract-syntax-tree

我有一个字符串,它是numpy数组的列表。 字符串看起来像

k = '[array([  0, 269, 175, 377]), array([  0,  56, 149, 163])]'

当我这样做时

ast.literal_eval(k)

我收到错误说明格式错误的节点或字符串。

这是什么问题?有没有更好的方法将其转换回列表?

感谢您的帮助!!

3 个答案:

答案 0 :(得分:3)

来自ast.literal_eval doc

  

提供的字符串或节点可能只包含以下Python文字结构:字符串,字节,数字,元组,列表,字符串,集合,布尔值和无。

这里不能使用文字eval。首先查找这些字符串的生成位置,并在那里实现正确的序列化 - 例如使用numpy.save

答案 1 :(得分:1)

我不确定这是不是一个好方法。

from numpy import array
import ast
import re
k = '[array([  0, 269, 175, 377]), array([  0,  56, 149, 163])]'
val = re.findall(r"\((.*?)\)", k)
val = list(map(ast.literal_eval, val))
val = list(map(array, val))
print(val)

<强>输出:

[array([  0, 269, 175, 377]), array([  0,  56, 149, 163])]
  • 使用Regex在()
  • 之间提取内容
  • 申请ast.literal_eval
  • 申请np.array

答案 2 :(得分:0)

import numpy as np

array = np.array
k = '[array([  0, 269, 175, 377]), array([  0,  56, 149, 163])]'
k = eval(k)
print(f"k = {k}, type of k = {type(k)}")
print(type(k[0]))

输出:

k = [array([  0, 269, 175, 377]), array([ 0, 56])], type of k = <class 'list'>

<class 'numpy.ndarray'>