如何编写和读取datetime字典。

11 浏览
0 Comments

如何编写和读取datetime字典。

这个问题已经有了答案:

如何克服“datetime.datetime not JSON serializable”?

使用常规编码器使对象JSON可序列化

我需要一种有效的方法来编写包含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日
0
0 Comments

您可以使用 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())]}

0
0 Comments

你可能觉得这有些繁琐,但在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进行加载,然后转换已知的键以避免使用自定义解码器。

0