我想跟踪 python 程序生命周期中某些数据结构(字典)发生的变化。我们可以通过拍摄快照或备份来实现这一点。备份不是“内存友好的”,因为它们需要将整个结构存储在内存中。因此,最巧妙的方法是拍摄快照(类似于 Git 暂存文件的方式)。
我不想使用数据库。
您可以使用pickle来保存Python数据结构。如果您随后使用日期(时间)模块来创建文件名,您将得到类似快照的内容:
import pickle
import datetime
def backup(your_data):
with open(f"backup {datetime.datetime.now()}", "wb") as file:
pickle.dump(your_data, file)
要获取数据,请使用 pickle.load 方法。
晚了四年,但我经常遇到这个问题。
我也不为此使用数据库,但技巧是您需要像将其放入数据库中一样对待要快照的数据。我的意思是,将数据压缩成最紧凑的形式,其中仍然有足够的信息来恢复原始数据结构。基本上,它与我之前的 pickling 答案类似,但具有人类可读的潜力。
对于相关数据结构,您需要两个函数:
to_json
将数据转换为 JSON 对象,以及 from_json
恢复对象。
obj == from_json(to_json(obj))
压缩数据的逻辑是只包含其他现有信息无法不断表达的信息。
例如,根据毕达哥拉斯定理,给定一个整数字典
{'a': 3, 'b': 4, 'c': 5}
,a**2 + b**2 = c**2
。由于c
可以用a
和b
来表示,因此可以压缩字典以删除c
。
data = {'a': 3, 'b': 4, 'c': 5}
>>> compressed = to_json(data)
>>> compressed == {'a': 3, 'b': 4}
True
>>> restored = from_json(compressed)
>>> restored == data
True
>>> restored['c'] == (compressed['a']**2 + compressed['b']**2)**0.5
True
最重要的是对要压缩和恢复的数据有一套铁定的规则,这些规则永远不应该被破坏,因为与原始对象相比,这样做可能会导致恢复后的数据丢失。
我希望这个解释虽然很抽象,但可以帮助任何将来遇到这种困境的人。