如何使用PyYAML创建日期时间对象

时间:2010-11-17 01:08:10

标签: python yaml pyyaml

我希望能够使用datetime.datetime.now() PyYAML创建一个日期时间对象。调用某些函数很容易:

>>> y = """#YAML
... description: Something
... ts: !!python/object/apply:time.time []"""
>>> yaml.load(y)
{'description': 'Something', 'ts': 1289955567.940973}
>>> 

但是,我似乎无法弄清楚如何获得datetime.now()。我尝试使用各种python yaml tags来调用那些更多的排列。

这些都失败了:

tests = [ 
        'dt: !!python/object:datetime.datetime.now []',
        'dt: !!python/object/new:datetime.datetime.now []',
        'dt: !!python/object/apply:datetime.datetime.now []',
]

for y in tests:
    try:
        print yaml.load(y)
    except Exception, err:
        print '==>', err

2 个答案:

答案 0 :(得分:6)

我认为这个例子可以实现您的目标:

dt = yaml.load("""dt: !!python/object/apply:apply
    - !!python/object/apply:getattr
        - !!python/name:datetime.datetime
        - now
    - []
""")

但是,我认为它太牵强了,因为PyYAML支持的!!python/object语法不应该调用类方法(datetime.datetime.now实际上就像是日期时间对象的“静态”工厂方法) 。正如你所说,这更简单(虽然不是你想要的):

dt = yaml.load("dt: !!python/object/apply:time.gmtime []")
dt = yaml.load("dt: !!python/object/apply:time.time []")

另一种可能的解决方法是创建一个自定义帮助函数,将函数包装到datetime.datetime.now,以便使用!!python/object/apply轻松序列化。缺点是这个序列化不能移植到找不到这个自定义函数的环境。

无论如何,在我看来,序列化一个始终返回当前日期时间的值(实际上是解析YAML的时间)并没有多大意义。 PyYAML提供了此序列化某个时间戳的快捷方式:

dt = yaml.load("""dt: !!timestamp '2010-11-17 13:12:11'""")

答案 1 :(得分:0)

问题是该对象没有PyYAML需要自动生成YAML表示的方法。为什么不做datetime.datetime.now().isoformat()并存储该字符串呢?

或者,您可以将datetime对象的所需属性放入字典中并加载它。

如果要存储isoformat字符串,只需将其放入字符串并转储它:

timestamp = datetime.datetime.now().isoformat()

当您重新阅读时,请使用strptime()方法:

new_dt_object = datetime.datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S.%f')

当然,搞笑,我刚刚意识到你可以做到:

yaml_timestamp = yaml.dump({'timestamp': datetime.datetime.now()})

如果您使用yaml.load(yaml_timestamp)加载,则会发现自己拥有一个闪亮的新datetime.datetime对象。