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

Python 如何在腌制对象上加盖日期戳,python,pickle,Python,Pickle,我有一个脚本,可以在线获取某些信息并将其存储在列表中。我想保留这个列表,以便将来执行脚本,然后在一段时间后(比如说3天)再次在线检索信息,以防它过时。我的理解是,我可以对列表进行pickle处理(但请告诉我是否有更可取的存储方法——编辑:我应该使用shelve还是json?) 我的主要问题是:存储pickle的日期和时间,然后评估是否已经过了3天,最好和最惯用的方法是什么?一种完全避免存储和管理单独的文件对象来跟踪时间戳的方法是使用os.path.getmtime()获取linux为正在刷新的列

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


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

一种完全避免存储和管理单独的文件对象来跟踪时间戳的方法是使用
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

一种完全避免存储和管理单独的文件对象来跟踪时间戳的方法是使用
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

下面是一个从存储一些数据和将数据存储在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})

下面是一个从存储一些数据和将数据存储在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})

所以,这只是与其他答案的一个微小差异,但我认为这是一个很好的答案。 如果将
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)
>>> 

所以,这只是与其他答案的一个微小差异,但我认为这是一个很好的答案。 如果将
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)
>>> 


对,但是我如何存储关于pickle对象的整数呢?我要分开腌制吗?我是否将其添加为腌制列表的第一个元素?等等。你的日期列表有多大?我没有日期列表。我想要的是在检索和构建列表时加盖日期戳。但是我的列表有几千个条目。只需使用pickle文件在
getmtime()
中的最后一次修改时间,正如您在最后提到的,就是所需的全部内容(假设其中只存储了一个列表)。其他任何事情都是多余的。我认为这样做可能是个好主意。您还可以简化那里的代码。在中间,这将更容易:<代码>文件时间= OS.PATT.GETMIME(文件名)<代码> >代码>现在= Time.Time[()] /代码>,然后是“代码> Delta=DATETIME.TIME Delta(秒=现在FielTime)< /Calp>。我要分开腌制吗?我是否将其添加为腌制列表的第一个元素?等等。你的日期列表有多大?我没有日期列表。我想要的是在检索和构建列表时加盖日期戳。但是我的列表有几千个条目。只需使用pickle文件在
getmtime()
中的最后一次修改时间,正如您在最后提到的,就是所需的全部内容(假设其中只存储了一个列表)。其他任何事情都是多余的。我认为这样做可能是个好主意。您还可以简化那里的代码。在中间,这将更容易:<代码>文件时间= OS.PATH.GETMIME(文件名),<代码>现在= Time.Time[()] /代码>,然后<代码> delta = DATETIME.TIMELTAL(秒=现在文件时间)< /代码> .我不明白.pickle转储似乎不涉及实际数据。这是故意的吗?对不起,是打字错误!刚刚修复。json是用来存储{date:data}的,还是仅仅是一个即使没有json也可以使用的字典?当你在处理数据时,你可以使用dict。我不明白。pickle转储似乎不涉及实际数据。这是故意的吗?对不起,是打字错误!刚刚修复。json是用来存储{date:data},还是仅仅是一个即使没有json也可以使用的字典?当你清理数据时,你可以使用dict。如果你将每个列表保存在一个单独的文件中,你不能只检查文件的时间戳来确定它的年龄(不管文件的格式如何)?单独存储时间戳——像这样或那样——可能比仅仅为了知道它有多旧而将整个内容读入内存要快。至于使用何种格式,pickle和shelve非常以Python为中心,而JSON是一种独立于语言的数据格式(XML、CSV和各种其他格式也可以通过各种内置和第三方模块在Python中处理)。文件大小也可能是一个考虑因素。那么你的意思是像下面Projski的建议一样吗?是的,这就像@Projski的“另一种方法”。如果你将每个列表保存在一个单独的文件中,你不能只检查文件的时间戳来确定它的年龄(无论文件的格式如何)?单独存储时间戳——像这样或那样——可能比仅仅为了知道它有多旧而将整个内容读入内存要快。至于使用何种格式,pickle和shelve非常以Python为中心,而JSON是一种独立于语言的数据格式(XML、CSV和各种其他格式也可以通过各种内置和第三方模块在Python中处理)。文件大小也可能是一个考虑因素。那么你的意思是像下面Projski的建议一样?是的,就像@Projski的“另一种方法”。