我正在尝试将信息加载到用户定义的函数中,以便进一步处理。由于输入文件必须由非程序员生成,所以我选择了以下格式:
#contents of vessel_data.txt
hull_length = 100000.
hull_width = 50000.
etc.然后,我的函数通过execfile()加载输入文件。然后,我希望将数据分组到一个数组中,并将其作为函数的输出传递。大致如此:
file_path = ..\vessel_name.txt
def my_input_func(file_path):
execfile(file_path)
data = np.array([[hull_length],
[hull_width ],
[etc. ]])
return(data)我知道通过exec()和execfile()加载数据是不允许的,但请记住,输入是由非程序员生成的。无论如何,我得到以下错误:
NameError: global name 'hull_length' is not defined添加这些行后,我可以确认我的变量按预期加载到local名称空间中:
print 'Locals: ' + str([x for x in locals() if x[0] == 'h'])
print 'Globals: ' + str([x for x in globals() if x[0] == 'h'])令我困惑的是,当我试图定义变量时,为什么我的函数会使用global名称空间。我的印象是,除非具体说明,否则函数中的所有内容都处理函数本地的名称空间。我可以通过将我的execfile()命令修改为:
execfile(file_path, globals())但是我不想把所有的东西都加载到全局名称空间中。
那么,在不将所有内容加载到global名称空间的情况下,如何使它工作呢?
亲切的问候,拉斯摩斯
========编辑=======
根据昆汀的回答,我就是这样做的:
file_path = ..\vessel_name.txt
def my_input_func(file_path):
vessel_vars = {}
execfile(file_path, vessel_vars)
data = np.array([[vessel_vars['hull_length']],
[vessel_vars['hull_width'] ],
[vessel_vars['etc.'] ]])
return(data)干杯昆廷!
发布于 2013-09-05 08:40:36
execfile()警告要修改函数局部变量:这是不可能的!
默认局部变量在下面对函数局部变量()进行了描述:不应该尝试对默认局部变量字典进行修改。如果需要在函数execfile()返回后查看代码对局部变量的影响,则传递显式局部变量字典。execfile()不能可靠地用于修改函数的局部变量.
它不是关于execfile(),而是关于局部变量():
def f():
locals()['a'] = 3
print(a)您还将获得NameError: global name 'a' is not defined。这可能是为了优化目的。这里的解决方案是使用字典:
file_path = os.path.join('..', 'vessel_name.txt')
def my_input_func(file_path):
vessel = {}
execfile(file_path, vessel)
data = np.array([[vessel['hull_length']],
[vessel['hull_width'],
[vessel['etc.']])
return(data)注意:我假设您使用的是Python 2,但是Python 3中的情况是一样的,只是execfile()现在是exec(),您需要自己打开文件。
https://stackoverflow.com/questions/18631014
复制相似问题