我有一个字典的字符串表示形式。这是一个嵌套的字典,甚至更复杂,其中的record_time
键具有如下所示的日期时间值:
d = """{
"motion_measure": {"INCAR": 69, "RANDOM": 63, "UNKNOWN": 62, "BIKING": 57, "WALKING": 48, "RUNNING": 41, "SEDENTARY": 0},
"samples": [0, 1.1791444, 11.036073],
"record_time": datetime.datetime(2018, 3, 26, 10, 3, 17, 441000)
}"""
我尝试了两种建议的in this related question方法:
import ast
ast.literal_eval(d)
ast.literal_eval
不起作用,因为它无法处理日期时间值。
import json
json.loads(d)
json.loads
也不起作用,因为日期时间格式不可反序列化。
有人知道使用Python将其转换回dict或json的好方法吗?我从OrientDB获得了这种奇怪的记录格式。
答案 0 :(得分:0)
如果可以使用'eval'(因为它正在执行数据,这很危险,所以很危险),则可以执行'eval'。
import datetime
d = <... your string ...>
new_dict = eval(d)
答案 1 :(得分:0)
由于您的字符串接近json,因此您可以将其清理一点并使用json.loads
(并避免使用eval
)。
例如,如果您可以将日期时间值转换为列表,那么一种方法是在转换为字典之前替换字符串中的datetime.datetime(...)
的所有实例(以下示例使用regex处理替代)。然后,您可以使用datetime
处理结果字典中的日期时间列表。
例如(将额外的日期时间添加到您的输入字符串中,以确保替换内容可以处理多个日期时间出现和日期时间而没有指定毫秒等):
import datetime
import re
import json
s = """{
"motion_measure": {"INCAR": 69, "RANDOM": 63, "UNKNOWN": 62, "BIKING": 57, "WALKING": 48, "RUNNING": 41, "SEDENTARY": 0},
"samples": [0, 1.1791444, 11.036073],
"record_time": datetime.datetime(2018, 3, 26, 10, 3, 17, 441000),
"another_time": datetime.datetime(2017, 3, 26, 10, 3)
}"""
# re.sub to replace datetime; json.loads to convert to dict
d = json.loads(re.sub(r'datetime\.datetime\(([^)]*)\)', r'[\1]', s))
# datetime.datetime(...) to work with resulting datetime lists
date1 = datetime.datetime(*d['record_time'])
date2 = datetime.datetime(*d['another_time'])
print(d)
# OUTPUT (shown on multiple lines for readability)
# {
# 'motion_measure': {'INCAR': 69, 'RANDOM': 63, 'UNKNOWN': 62, 'BIKING': 57, 'WALKING': 48, 'RUNNING': 41, 'SEDENTARY': 0},
# 'samples': [0, 1.1791444, 11.036073],
# 'record_time': [2018, 3, 26, 10, 3, 17, 441000],
# 'another_time': [2017, 3, 26, 10, 3]
# }
print(date1)
print(date2)
# OUTPUT
# 2018-03-26 10:03:17.441000
# 2017-03-26 10:03:00