我有多个字典,它们不是用逗号分隔的,类型是字符串,是否可以将它们分开并在列表中获得好的元素,每个元素代表一个字典。
例如: 我有什么:{} {} {}
我想要的 [{}、{}、{}]
我知道它类似于 Want to separate list of dictionaries not separated by comma , 但我不想调用子进程并调用 sed。
示例:
data = {"key1":"val1", "key2":"val2", "key3":"val3", "key4":"val4"} {"key1":"someval", "key2":"someval", "key3":"someval", "key4":"someval"} {"key1":"someval", "key2":"someval", "key3":"someval", "key4":"someval"}
what i want is :
[{"key1":"val1", "key2":"val2", "key3":"val3", "key4":"val4"} ,
{"key1":"someval", "key2":"someval", "key3":"someval", "key4":"someval"},
{"key1":"someval", "key2":"someval", "key3":"someval", "key4":"someval"}]
我如何实现这一目标。
示例 2:
string = '''{"Date1":"2017-02-13T00:00:00.000Z","peerval":"222.22000","PID":109897,"Title":"Prop 1","Temp":5,"Temp Actual":5,"Temp Predicted":3.9,"Level":"Medium","Explaination":"Source: {some data \n some link http:\\www.ggogle\.com with some sepcial characters ">< ?? // {} [] ;;}","creator":"\\etc\\someid","createdtime" :"2017-02-12T15:24:38.380Z"}
{"Date1":"2017-02-13T00:00:00.000Z","peerval":"222.22000","PID":109890,"Title":"Prop 2","Temp":5,"Temp Actual":5,"Temp Predicted":3.9,"Level":"Medium","Explaination":"Source: {some data \n some link http:\\www.ggogle\.com with some sepcial characters ">< ?? // {} [] ;;}","creator":"\\etc\\someid","createdtime" :"2017-02-12T15:24:38.380Z"}
'''
注意:每个字典都以 $(newline) 结尾
请您参考如下方法:
这种方法有点慢(关于字符串长度大约为 O(N^2)),但它可以处理相当复杂的文字语法,包括嵌套数据结构。在连续较小的 s 切片上循环调用 ast.literal_eval,直到找到语法上有效的切片。然后删除该切片并继续,直到字符串为空。
import ast
def parse_consecutive_literals(s):
result = []
while s:
for i in range(len(s), 0, -1):
#print(i, repr(s), repr(s[:i]), len(result))
try:
obj = ast.literal_eval(s[:i])
except SyntaxError:
continue
else:
result.append(obj)
s = s[i:].strip()
break
else:
raise Exception("Couldn't parse remainder of string: " + repr(s))
return result
test_cases = [
"{} {} {}",
"{}{}{}",
"{1: 2, 3: 4}{5:6, '7': [8, {9: 10}]}",
"[11] 'twelve' 13 14.0",
"{} {\"'hi '}'there\"} {'whats \"}\"{\"up'}",
"{1: 'foo\\'}bar'}"
]
for s in test_cases:
print("{} parses into {}".format(repr(s), parse_consecutive_literals(s)))
结果:
'{} {} {}' parses into [{}, {}, {}]
'{}{}{}' parses into [{}, {}, {}]
"{1: 2, 3: 4}{5:6, '7': [8, {9: 10}]}" parses into [{1: 2, 3: 4}, {5: 6, '7': [8, {9: 10}]}]
"[11] 'twelve' 13 14.0" parses into [[11], 'twelve', 13, 14.0]
'{} {"\'hi \'}\'there"} {\'whats "}"{"up\'}' parses into [{}, {"'hi '}'there"}, {'whats "}"{"up'}]
"{1: 'foo\\'}bar'}" parses into [{1: "foo'}bar"}]
但是,我并没有热情地认可这种用于生产质量代码的解决方案。首先以更合理的格式序列化您的数据会好得多,例如 json。
