【问题标题】:How to date-stamp a pickled object如何在腌制的物体上加盖日期
【发布时间】:2016-05-16 19:25:39
【问题描述】:

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

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

【问题讨论】:

  • 如果您将每个列表保存在单独的文件中,您不能只检查文件的时间戳以确定其年龄(无论文件的格式如何)?单独存储时间戳——像这样或其他方式——可能比为了找出它的年龄而将整个事情读入内存要快。至于使用什么格式,pickle 和 shelve 非常以 Python 为中心,而 JSON 是一种独立于语言的数据格式(XML、CSV 和各种其他格式也可以通过各种内置在 Python 中处理)和第三方模块)。文件大小也可能是一个考虑因素。
  • 你的意思是像下面 Projski 的建议?
  • 是的,就像@Projski 的“另一种方法”。

标签: python pickle


【解决方案1】:

一种完全避免存储和管理单独的文件对象来跟踪时间戳的方法是使用os.path.getmtime() 来获取 linux 为您正在刷新的列表/文件记录的日期修改时间戳。

例如:

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

【讨论】:

  • 对,但是我将如何存储与腌制对象相关的整数呢?我要单独腌制吗?我是否将其添加为我的腌制列表的第一个元素?等等。
  • 你的日期列表有多大?
  • 我没有日期列表。我想要的是在检索和构建列表时加上日期戳。但我的列表有几千个条目。
  • 只需使用来自getmtime() 的pickle 文件的最后修改时间——正如你在最后提到的——就足够了(假设其中只存储了一个列表)。其他任何事情都是多余的。
  • 我认为这样做可能是件好事。您还可以在那里简化代码。在中间这会更容易:filetime = os.path.getmtime(filename)now = time.time(),然后是delta = datetime.timedelta(seconds=now-filetime)
【解决方案2】:

这是一个存储来自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})

【讨论】:

  • 我不明白。泡菜转储似乎不涉及实际数据。这是故意的吗?
  • 抱歉,打错了!刚刚修好了。
  • json是用来存储{date:data}的,还是只是一个字典,不用json也能用?
  • 当你腌制数据时,你可以使用 dict。
【解决方案3】:

因此,这与其他答案仅略有不同,但我认为这是一个不错的答案。 如果将datetime 对象与单独的dump 一起存储,则可以独立于数据读取它。如果您的数据很大,这很重要。下面,我展示了检查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)
>>> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    相关资源
    最近更新 更多