如何编写和读取datetime字典。
如何编写和读取datetime字典。
这个问题已经有了答案:
我需要一种有效的方法来编写包含datetime的字典的文件,并能够将它们作为字典读取。像这些字典一样:
my_dict = {'1.0': [datetime.datetime(2000, 1, 1, 0, 0, 0, 000000, tzinfo=tzutc())], '2.0': [datetime.datetime(2000, 1, 1, 0, 0, 0, 000000, tzinfo=tzutc())]}
尝试使用json转储:
with open("my_file.json", 'w+') as f: json.dump(my_dict, f)
TypeError: Object of type 'datetime' is not JSON serializable
还尝试将整个字典写为字符串,然后使用yaml导入它,几乎可以,但出现了索引混乱的问题。
with open("my_file", 'w+') as f: f.write(str(my_dict)) with open("my_file", 'r') as f: s = f.read() new_dict = yaml.load(s) print(new_dict['1.0'][0])
Output: datetime.datetime(2000 Expected: 2000-01-01 00:00:00+00:00
admin 更改状态以发布 2023年5月23日
您可以使用 Pickle
。它用于序列化和反序列化Python对象结构。Python中的任何对象都可以被pickle,以便可以将其保存在磁盘上。Pickle的工作原理是,在将对象写入文件之前,首先将其“序列化”。Pickling是一种将Python对象(列表、字典等)转换为字符流的方法。想法是,这个字符流包含在另一个Python脚本中重构对象所需的所有信息。来源
这将有效:
>>> import pickle >>> file_Name = "testfile" >>> fileObject = open(file_Name,'wb') >>> my_dict = {'1.0': [datetime.datetime(2000, 1, 1, 0, 0, 0, 000000, tzinfo=tzutc())], '2.0': [datetime.datetime(2000, 1, 1, 0, 0, 0, 000000, tzinfo=tzutc())]} >>> pickle.dump(my_dict, fileObject) >>> fileObject.close() >>> fileObject = open(file_Name,'r') >>> my_dict_loaded = pickle.load(fileObject) >>> my_dict_loaded {'1.0': [datetime.datetime(2000, 1, 1, 0, 0, 0, 000000, tzinfo=tzutc())], '2.0': [datetime.datetime(2000, 1, 1, 0, 0, 0, 000000, tzinfo=tzutc())]}
你可能觉得这有些繁琐,但在Python中使用自定义编码器是正确的方法。 您可以选择您的格式(在此处为iso,但我建议在您的示例中使用datetime.date()。
from datetime import date,datetime import json, re class DateTimeAwareEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, datetime): return o.isoformat() return json.JSONEncoder.default(self, o) json.dumps(yourobj, cls=DateTimeAwareEncoder)
如何使用自定义解码器要复杂得多,通常最好的方法是使用json.loads
进行加载,然后转换已知的键以避免使用自定义解码器。