将列表的复杂字符串表示形式(包含元组,看起来像函数调用)转换为列表

问题描述 投票:0回答:1

这是我尝试转换为列表的列表的字符串表示形式:

[(3479865,
  PaginatedManagedEntityHeaders(
  success=True, 
  count=0, 
  rows=[
  ManagedEntityHeader(
  case_role='Reference',
  display_name='Person A',
  entity_type='PERSON', 
  unique_id=247878382, 
  is_active='1', 
  date_created=datetime.datetime(2021, 10, 18, 16, 29, 6, 535000, tzinfo=TzInfo(UTC))),
  ManagedEntityHeader(
  case_role='Reference', 
  display_name='Person B', 
  entity_type='PERSON', 
  unique_id=247563788, 
  is_active='0', 
  date_created=datetime.datetime(2021, 9, 8, 21, 4, 29, 631000, tzinfo=TzInfo(UTC)))]
))]

我已将其保存为 JSON 文件:“test_fixture.json”,这是我迄今为止尝试过的:

import os
import json
import ast
import re

the_file = os.path.join(r"test_fixture.json")

file_str = open(the_file).read()

meth1 = file_str.strip("][").split(", ")
# receive a list of 25 instead of a list of 1

meth2 = ast.literal_eval(file_str)
# ValueError: malformed node or string on line 2: <ast.Call object at 0x000002241687F8E0>

meth3 = json.loads(file_str)
# JSONDecodeError: Expecting value

elements = re.findall(r"\d+", file_str)
meth4 = [int(x) for x in elements]
# receive a list of 20 instead of a list of 1

meth5 = eval(file_str)
# NameError: name 'PaginatedManagedEntityHeaders' is not defined

meth6 = list(map(int, file_str[1:-1].split(",")))
# ValueError: invalid literal for int() with base 10: '(3479865'

是否有另一种方法(

meth_that_worked
)可以成功将字符串转换为包含 1 个元素的列表?

print(meth_that_worked)
应该产生与上面列表的字符串表示形式相同的输出。

print(type(meth_that_worked))
应产生
<class 'list'>
print(len(meth_that_worked))
应该产生
1

python list type-conversion tuples function-call
1个回答
0
投票

您需要使用合适的语法等来解析它。如果您的列表使用Python语法,您可以使用像astroid这样的库,例如。克:

from astroid import parse

list_code = '''
[
    ('example', 7),
    ('list', 'with'),
    'tuples',
    ()
]
'''

m = parse(list_code)
print(m.body[0].value.elts)

在这种情况下

m.body[0].value.elts
将是 astroid AST 节点的列表。

如果你想要实际的 python 对象而不是 AST 节点,你可以使用第五种方法:

list_code = '''
[
    ('example', 7),
    ('list', 'with'),
    'tuples',
    ()
]
'''

print(eval(list_code))

此方法出现错误,因为

PaginatedManagedEntityHeaders
未定义。
eval
实际上评估并运行Python代码,因此您必须在调用
eval
之前创建/导入列表中调用的每个类/函数。

© www.soinside.com 2019 - 2024. All rights reserved.