将文件加载到变量中

2024-05-29 05:08:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个小函数来获取一个变量名,检查它是否存在,如果没有,就从一个文件(使用pickle)将其加载到全局命名空间。在

我试着在一个文件中使用这个:

import cPickle

#
# Load if neccesary
#
def loadfile(variable, filename):
    if variable not in globals():
        cmd = "%s = cPickle.load(file('%s','r'))" % (variable, filename)
        print cmd
        exec(cmd) in globals()

但是它不起作用-变量没有被定义。我做错什么了?在


Tags: 文件函数inimportcmdif空间load
2条回答

使用“globals”有一个问题,它只适用于当前模块。与其到处传递'globals',更好的方法是直接在命名空间上使用'setattr'内置。这意味着您可以在实例和模块上重用该函数。在

import cPickle

#
# Load if neccesary
#
def loadfile(variable, filename, namespace=None):
    if module is None:
        import __main__ as namespace
    setattr(namespace, variable, cPickle.load(file(filename,'r')))

# From the main script just do:
loadfile('myvar','myfilename')

# To set the variable in module 'mymodule':
import mymodule
...
loadfile('myvar', 'myfilename', mymodule)

注意模块名:主脚本始终是modulemain。如果你在跑步脚本.py而“导入脚本”你会得到一个单独的代码副本,这通常不是你想要的。在

你总是可以完全避开exec:


import cPickle

#
# Load if neccesary
#
def loadfile(variable, filename):
    g=globals()
    if variable not in g:
        g[variable]=cPickle.load(file(filename,'r'))

编辑:当然,这只会将全局变量加载到当前模块的全局变量中。在

如果要将这些内容加载到另一个模块的全局变量中,最好将它们作为参数传入:

^{pr2}$

相关问题 更多 >

    热门问题