如何编写和阅读日期时间词典

时间:2017-06-19 12:04:24

标签: python json datetime dictionary eval

我需要一种有效的方法来编写包含字典的文件,包括日期时间,然后能够将它们作为dicts读取。像这样的Dicts:

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

还尝试将整个dict编写为String,然后使用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

3 个答案:

答案 0 :(得分:2)

你可能觉得它很重,但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然后转换已知密钥以避免自定义解码器来处理。

答案 1 :(得分:1)

您可以使用Pickle。它用于序列化和反序列化Python对象结构。可以对python中的任何对象进行pickle,以便将其保存在磁盘上。 pickle的作用是在将对象写入文件之前先将其“序列化”。 Pickling是一种将python对象(list,dict等)转换为字符流的方法。这个想法是这个字符流包含在另一个python脚本中重建对象所需的所有信息。 Source

这样可行:

>>> 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())]}

答案 2 :(得分:0)

您可以使用strftime方法:

my_dict = {
    '1.0': [
               datetime.datetime(
                   2000, 
                   1, 
                   1, 
                   0, 
                   0, 
                   0, 
                   000000, 
                   tzinfo=tzutc()
              ).strftime("%Y-%m-%d %H:%M:%S")],
    '2.0': [
              datetime.datetime(
                   2000, 
                   1, 
                   1, 
                   0, 
                   0, 
                   0, 
                   000000, 
                   tzinfo=tzutc()
              ).strftime("%Y-%m-%d %H:%M:%S")
           ]

}