在 Python 中保存和重新加载变量,保留名称
saving and reloading variables in Python, preserving names
经过多年的 Matlab 使用,我才开始 Python。我仍在学习所有的差异。我正在使用 Jupyter Notebooks(必须与其他人一起使用)
我无法理解的事情是保存变量,以便它们可以加载到另一个脚本中。我想要 运行 一个脚本来处理一些数据,产生几个变量。然后我想将这些变量保存到文件中并能够在另一个脚本中重新加载它们。
假设我的变量名称是,'wbl'、'wbr'、'body_ang'
在 Matlab 中这是微不足道的,类似于:
save(filename,'wbl','wbr','body_ang')
然后我可以通过以下方式加载变量:
load(filename)
我在 Python 中找不到任何具有相同功能的东西。您可以使用例如保存变量numpy.save,但它不保留变量名。因此,除非您知道保存它们的顺序,否则您无法重新创建它们。
我希望它们作为单独的变量,而不仅仅是作为数组的一部分(除非它们在加载后可以很容易地重新创建)。
看似简单明了的事情,但我不知道该怎么做。
不是 Python 的东西,而是 Jupyter Notebook 的东西是 %store
让你在一个笔记本中保存变量以在另一个笔记本中检索的命令:
商店:
x = 10
%store x
Stored 'x' (int)
检索:
%store -r x
x
10
我能想到的一个选项是 pickle 文件
import pickle as pkl
with open('my_variables','wb') as f:
pkl.dump([wb1,wbr,body_ang],f)
import pickle as pkl
with open('my_variables','rb') as f:
new_script=pkl.load(f)
#this link 可能有帮助:(https://www.jessicayung.com/how-to-use-pickle-to-save-and-load-variables-in-python/)
希望对您有所帮助,我对编码比较陌生,python
这是 json 格式的 storing/loading 变量的小辅助模块:
import json
import inspect
def save_vars(fname, *args):
d = {}
caller_vars = inspect.stack()[1].frame.f_locals
for arg in args:
if arg in caller_vars:
d[arg] = caller_vars[arg]
with open(fname, 'w') as f:
f.write(json.dumps(d))
def load_vars(fname):
caller_vars = inspect.stack()[1].frame.f_locals
with open(fname, 'r') as f:
d = json.loads(f.read())
for k,v in d.items():
caller_vars[k] = v
将此模块保存在当前目录中,例如 myvars.py .
使用方法如下:
sgal@diff$ python3
Python 3.9.0 (default, Nov 30 2020, 15:21:09)
>>> from myvars import *
>>> a,b,c=1,2,3
>>> save_vars('vars','a','b','c')
sgal@diff$ cat vars
{"a": 1, "b": 2, "c": 3}
sgal@diff$ python3
Python 3.9.0 (default, Nov 30 2020, 15:21:09)
>>> from myvars import *
>>> load_vars('vars')
>>> a
1
>>> b
2
>>> c
3
正如 Epsi95 所说,您可以使用 Python 中的 pickle
模块,它将 Python 个对象保存到文件中。
如果你想记录全局变量的值,那么使用这些函数(它们的工作就像你从 Matlab 中给出的例子一样):
import pickle
def save(filename, *args):
# Get global dictionary
glob = globals()
d = {}
for v in args:
# Copy over desired values
d[v] = glob[v]
with open(filename, 'wb') as f:
# Put them in the file
pickle.dump(d, f)
def load(filename):
# Get global dictionary
glob = globals()
with open(filename, 'rb') as f:
for k, v in pickle.load(f).items():
# Set each global variable to the value from the file
glob[k] = v
你可以这样称呼它们:
save(filename,'wbl','wbr','body_ang')
load(filename)
这仅适用于全局变量,因此以下内容无效:
def foo():
u = 8
# "u" is not a global variable, so it can't be saved
# This will raise an Exception
save("bar", "u")
foo()
# Even if we did save "u", where do we put it now?
# The function isn't running, so we'd have it put it in globals
load("bar")
不过,使用 global
关键字可以帮助您:
def foo():
global u = 8
# "u" is a global variable, so everything will work fine
save("bar", "u")
# Delete it if you don't want "u" to stick around after function
del u
foo()
# Put "u" back in globals
load("bar")
如果你想保存除全局变量之外的其他变量,你需要做一些事情,比如pickle
一个字典,你的所有值都映射在它里面,然后再检索整个字典。
编辑:修复了代码中的一些错误
经过多年的 Matlab 使用,我才开始 Python。我仍在学习所有的差异。我正在使用 Jupyter Notebooks(必须与其他人一起使用)
我无法理解的事情是保存变量,以便它们可以加载到另一个脚本中。我想要 运行 一个脚本来处理一些数据,产生几个变量。然后我想将这些变量保存到文件中并能够在另一个脚本中重新加载它们。
假设我的变量名称是,'wbl'、'wbr'、'body_ang'
在 Matlab 中这是微不足道的,类似于:
save(filename,'wbl','wbr','body_ang')
然后我可以通过以下方式加载变量:
load(filename)
我在 Python 中找不到任何具有相同功能的东西。您可以使用例如保存变量numpy.save,但它不保留变量名。因此,除非您知道保存它们的顺序,否则您无法重新创建它们。
我希望它们作为单独的变量,而不仅仅是作为数组的一部分(除非它们在加载后可以很容易地重新创建)。
看似简单明了的事情,但我不知道该怎么做。
不是 Python 的东西,而是 Jupyter Notebook 的东西是 %store
让你在一个笔记本中保存变量以在另一个笔记本中检索的命令:
商店:
x = 10
%store x
Stored 'x' (int)
检索:
%store -r x
x
10
我能想到的一个选项是 pickle 文件
import pickle as pkl
with open('my_variables','wb') as f:
pkl.dump([wb1,wbr,body_ang],f)
import pickle as pkl
with open('my_variables','rb') as f:
new_script=pkl.load(f)
#this link 可能有帮助:(https://www.jessicayung.com/how-to-use-pickle-to-save-and-load-variables-in-python/)
希望对您有所帮助,我对编码比较陌生,python
这是 json 格式的 storing/loading 变量的小辅助模块:
import json
import inspect
def save_vars(fname, *args):
d = {}
caller_vars = inspect.stack()[1].frame.f_locals
for arg in args:
if arg in caller_vars:
d[arg] = caller_vars[arg]
with open(fname, 'w') as f:
f.write(json.dumps(d))
def load_vars(fname):
caller_vars = inspect.stack()[1].frame.f_locals
with open(fname, 'r') as f:
d = json.loads(f.read())
for k,v in d.items():
caller_vars[k] = v
将此模块保存在当前目录中,例如 myvars.py .
使用方法如下:
sgal@diff$ python3
Python 3.9.0 (default, Nov 30 2020, 15:21:09)
>>> from myvars import *
>>> a,b,c=1,2,3
>>> save_vars('vars','a','b','c')
sgal@diff$ cat vars
{"a": 1, "b": 2, "c": 3}
sgal@diff$ python3
Python 3.9.0 (default, Nov 30 2020, 15:21:09)
>>> from myvars import *
>>> load_vars('vars')
>>> a
1
>>> b
2
>>> c
3
正如 Epsi95 所说,您可以使用 Python 中的 pickle
模块,它将 Python 个对象保存到文件中。
如果你想记录全局变量的值,那么使用这些函数(它们的工作就像你从 Matlab 中给出的例子一样):
import pickle
def save(filename, *args):
# Get global dictionary
glob = globals()
d = {}
for v in args:
# Copy over desired values
d[v] = glob[v]
with open(filename, 'wb') as f:
# Put them in the file
pickle.dump(d, f)
def load(filename):
# Get global dictionary
glob = globals()
with open(filename, 'rb') as f:
for k, v in pickle.load(f).items():
# Set each global variable to the value from the file
glob[k] = v
你可以这样称呼它们:
save(filename,'wbl','wbr','body_ang')
load(filename)
这仅适用于全局变量,因此以下内容无效:
def foo():
u = 8
# "u" is not a global variable, so it can't be saved
# This will raise an Exception
save("bar", "u")
foo()
# Even if we did save "u", where do we put it now?
# The function isn't running, so we'd have it put it in globals
load("bar")
不过,使用 global
关键字可以帮助您:
def foo():
global u = 8
# "u" is a global variable, so everything will work fine
save("bar", "u")
# Delete it if you don't want "u" to stick around after function
del u
foo()
# Put "u" back in globals
load("bar")
如果你想保存除全局变量之外的其他变量,你需要做一些事情,比如pickle
一个字典,你的所有值都映射在它里面,然后再检索整个字典。
编辑:修复了代码中的一些错误