ast.literal_eval () искаженный узел или строка при преобразовании строки со списком array () s - PullRequest
0 голосов
/ 29 мая 2018

У меня есть строка, которая представляет собой список массивов numpy.Строка выглядит как

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

Когда я делаю

ast.literal_eval(k)

, я получаю сообщение об ошибке, сообщающее о неправильном узле или строке.

В чем здесь проблема?Есть ли лучший способ преобразовать его обратно в список?

Спасибо за помощь !!

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Из ast.literal_eval doc :

Предоставленная строка или узел могут состоять только из следующих литеральных структур Python: строки, байты, числа, кортежи, списки,dicts, sets, booleans и None.

Здесь невозможно использовать литерал eval.Сначала найдите, где эти строки генерируются, и осуществите там правильную сериализацию - например, используя numpy.save.

0 голосов
/ 29 мая 2018

Я не уверен, что это хороший подход.

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