如何在腌制对象上加盖日期戳

How to date-stamp a pickled object

我有一个脚本可以在线获取某些信息并将其存储在列表中。我想保留脚本的未来执行列表,然后在一段时间后(比如 3 天)再次在线检索信息,以防它变得陈旧。我的理解是我可以对列表进行 pickle(但请告诉我是否有更明智的存储方式——编辑:我应该使用 shelve 还是 json 来代替?)。

我的主要问题是:存储 pickle 的日期和时间然后评估是否已经过去 3 天的最佳和最惯用的方法是什么?

一种完全避免必须存储和管理单独的文件对象来跟踪时间戳的方法是使用 os.path.getmtime() 获取 linux 为 [=16= 记录的日期修改时间戳】 说你爽。

例如:

import os
import datetime
import time
threshold = datetime.timedelta(days=3) # can also be minutes, seconds, etc.
filetime = os.path.getmtime(filename) # filename is the path to the local file you are refreshing
now = time.time()
delta = datetime.timedelta(seconds=now-filetime)
if delta > threshold:
    # do something

这里是存储来自 httpbin.org 的一些数据并将数据存储在 pickle 文件中的示例。

在此示例中,时间戳是来自注册表的键。

import json
import pickle
from datetime import datetime
from urllib.request import urlopen


url = "https://httpbin.org/ip"

with open('./dump_data.pkl', 'wb') as db:
    data = json.loads(urlopen('https://httpbin.org/ip').read())
    date = datetime.now().timestamp()
    pickle.dump(db, {date: data})

所以,这与其他答案只是略有不同,但我认为这是一个很好的答案。 如果您使用单独的 dump 存储 datetime 对象,那么您可以独立于数据读取它。如果您的数据很大,这很重要。下面,我展示了检查 datetime 元数据以查看它是否在最近三天内被转储,如果没有,那么它将读取数据。

>>> import pickle
>>> import datetime 
>>> d = datetime.datetime.now()
>>> w = (1,2,3)   
>>>
>>> with open('foo.pkl', 'wb') as f:
...     pickle.dump(d, f)
...     pickle.dump(w, f)
... 
>>>

现在等三天...

>>> import pickle
>>> import datetime
>>>
>>> with open('foo.pkl', 'rb') as f:
...     d_ = pickle.load(f)
...     if datetime.datetime.now() - d_ >= datetime.timedelta(3):
...         w_ = pickle.load(f)
...     else:
...         w_ = None
... 
>>> d_
datetime.datetime(2016, 5, 17, 6, 57, 37, 752703)
>>> w_
(1, 2, 3)
>>>