ast.literal_eval() 格式错误的节点或字符串,同时使用 array()s 列表转换字符串

ast.literal_eval() malformed node or string while converting a string with list of array()s

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

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

当我做

ast.literal_eval(k)

我收到一条错误消息,指出格式错误的节点或字符串。

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

感谢帮助!!

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

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])]
  • 使用正则表达式提取 ()
  • 之间的内容
  • 应用ast.literal_eval
  • 应用np.array

来自ast.literal_eval doc

The string or node provided may only consist of the following Python literal structures: strings, bytes, numbers, tuples, lists, dicts, sets, booleans, and None.

这里不能使用文字求值。首先找到这些字符串的生成位置,并在那里实施适当的序列化 - 例如使用 numpy.save.

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'>