这是我尝试转换为列表的列表的字符串表示形式:
[(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语法,您可以使用像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
之前创建/导入列表中调用的每个类/函数。