我想将所有全局变量保存到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())
答案 0 :(得分:2)
首先,这是一个坏主意。
globals()
不仅仅包含a
,b
和c
; 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特性,从长远来看,以更好的格式进行游戏会更好。