2017-06-19 79 views
1

我需要一种有效的方式来编写包含日期时间的字典的文件,然后能够将它们作为字符读取。类型的字典这样的:如何编写和读取日期时间字典

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 

回答

2

您可以使用Pickle。它用于序列化和反序列化Python对象结构。 python中的任何对象都可以被腌制,以便它可以保存在磁盘上。腌菜所做的是在将其写入文件之前首先将对象“串行化”。酸洗是一种将python对象(列表,字典等)转换为字符流的方法。这个想法是这个字符流包含了在另一个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())]} 
+0

我喜欢这种方法,是比我预期的要快得多 – Aminoff

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") 
      ] 

}

1

你可能会觉得这是重手,但在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

谢谢你。 – Aminoff

+0

你,先生,救了我的一天。 –

相关问题