在 Python 中保存和重新加载变量,保留名称

Sim*_*ker 7 python matlab save jupyter-notebook

在使用 Matlab 多年后,我刚刚开始使用 Python。我仍在学习所有差异。我正在使用 Jupyter Notebooks(这是必要的,因为它与其他使用它的人一起使用)

我无法理解的是保存变量,以便它们可以加载到另一个脚本中。我想运行一个处理一些数据的脚本,产生几个变量。然后我想将这些变量保存到文件中,并能够在另一个脚本中重新加载它们。

假设我的变量名称是“wbl”、“wbr”、“body_ang”

在 Matlab 中,这是微不足道的,例如:

save(filename,'wbl','wbr','body_ang')
Run Code Online (Sandbox Code Playgroud)

然后我可以使用以下命令加载变量:

load(filename)
Run Code Online (Sandbox Code Playgroud)

我在 Python 中找不到任何具有相同功能的东西。您可以使用例如 numpy.save 保存变量,但它不会保留变量名称。因此,除非您知道保存它们的顺序,否则无法重新创建它们。

我希望它们作为单独的变量,而不仅仅是作为数组的一部分(除非它们在加载后可以轻松地重新创建)。

这似乎是一件简单而明显的事情,但我不知道如何去做。

Fri*_*lon 5

正如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
    
Run Code Online (Sandbox Code Playgroud)

你可以用同样的方式称呼它们:

save(filename,'wbl','wbr','body_ang')

load(filename)

Run Code Online (Sandbox Code Playgroud)

这仅适用于全局变量,因此以下内容不起作用:

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")
Run Code Online (Sandbox Code Playgroud)

不过,使用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")

Run Code Online (Sandbox Code Playgroud)

如果您想保存除全局变量之外的其他变量,您将需要执行类似pickle字典的操作,将所有值映射到其中,并稍后检索整个字典。

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