在 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一个字典,你的所有值都映射在它里面,然后再检索整个字典。

编辑:修复了代码中的一些错误