用户可以一次性腌制然后重新加载所有变量吗? AutoSave功能的想法

时间:2013-12-05 15:26:39

标签: python

我想将所有全局变量保存到pickle文件中,然后重新加载pickle文件并让它检索所有pickle值并将它们放回原始变量中。这将是我正在编写的数据库程序的自动保存功能的基础,因此如果您想结束该日志记录会话,脚本将自动保存整个环境变量,以便您可以在以后轻松地重新加载它继续你保存之前的一切。

我无法弄清楚如何做到这一点。下面的代码可以工作,但是如果你看完第二次变量打印后,全局变量(ab& c)仍然被清零,而不是从pickle中重新填充。

甚至可以一次性重新分配所有全局变量吗?我错过了什么?

import pickle

global a,b,c

a = 1
b = 2
c = 3

print (globals())

AutoPickleFile = open('z:\\Pickle.txt','wb')
pickle.dump(globals, AutoPickleFile)
AutoPickleFile.close()

a = 0
b = 0
c = 0

AutoPickleFile = open('z:\\Pickle.txt','rb')
globals = pickle.load(AutoPickleFile)
AutoPickleFile.close()

print (globals())

2 个答案:

答案 0 :(得分:2)

首先,这是一个坏主意。

globals()不仅仅包含abc; pickle模块也是模块中的全局模块。此外,globals()映射还包含对__builtins__对象的引用,其中所有Python内置函数都存在,包括globals()函数本身。你不需要腌制任何这些。

坚持腌制你需要坚持的东西:

 with open('z:\\Pickle.txt', 'wb') as AutoPickleFile:
     pickle.dump((a, b, c), AutoPickleFile)

并再次加载:

 with open('z:\\Pickle.txt', 'rb') as AutoPickleFile:
     a, b, c = pickle.load(AutoPickleFile)

您尝试将内置函数globals视为字典的引用;您必须调用该函数才能访问映射以进行酸洗。

答案 1 :(得分:1)

使用JSON或其他数据格式序列化的“命名空间”会好得多。那么加载和卸载它会更加清晰......

e.g ..

vars = {}
vars["a"] = 444
a = open("test.json", "w")
a.write(json.dumps(vars))
a.close()
vars = json.loads(open("test.json"))

Pickle是不可靠的,非常具有python特性,从长远来看,以更好的格式进行游戏会更好。