我想读取外部数据源(excel)并创建包含数据的变量。假设数据在列中,每列都有一个带有变量名称的标题。
我的第一个想法是编写一个函数,以便我可以轻松地重用它。此外,我可以轻松地提供一些额外的关键字参数,以使该功能更加通用。
我面临的问题是我想通过变量名来引用python中的数据(交互式)。我不知道该怎么做(有一个功能)。我看到的唯一解决方案是从函数中返回变量名称和数据(例如列表),并执行以下操作:
def get_data()
(...)
return names, values
names, values = get_data(my_excel)
for n,v in zip(names, values):
exec(''.join([n, '= v']))
我可以直接获得相同的结果吗? 谢谢, 罗埃尔
答案 0 :(得分:2)
使用字典存储从名称到值的映射,而不是创建局部变量。
def get_data(excel_document):
mapping = {}
mapping['name1'] = 'value1'
# ...
return mapping
mapping = get_data(my_excel)
for name, value in mapping:
# use them
如果您真的想要从映射填充变量,可以修改globals()
(或locals()
),但通常认为这是不好的做法。
mapping = get_data(my_excel)
globals().update(mapping)
答案 1 :(得分:1)
如果您只想为名称中的每个名称设置局部变量,请使用:
for n, v in zip(names, values):
locals()[n] = v
如果您想要一个对象来访问数据,这样更清晰,只需使用dict,然后从函数中返回。
def get_data():
(...)
return dict(zip(names, values))
要访问名称“a”的值,只需使用get_data()["a"]
。
最后,如果要将数据作为对象的属性进行访问,则可以更新对象的__dict__
(如果任何列名等于任何special python methods,则可能会发生意外行为)。
class Data(object):
def __init__(self, my_excel):
(...)
self.__dict__.update(zip(names, values))
data = Data("test.xls")
print data.a
答案 2 :(得分:1)
传统方法是将键/值对填充到dict中,以便您可以轻松地将整个结构传递给其他函数。如果您确实希望将它们存储为属性而不是dict键,请考虑创建一个类来保存它们:
class Values(object): pass
store = Values()
for key, value in zip(names, values):
setattr(store, key, value)
将变量保存在自己的命名空间中,与运行的代码分开。这几乎总是一件好事。如果您收到一个名为“my_excel”的标题的电子表格怎么办?突然间,您无法访问原始的my_excel
对象,如果您再次需要它,这将非常不方便。
但无论如何,除非你确切知道自己在做什么,否则永远不要使用exec
。即使这样,也不要使用exec
。例如,我知道您的代码是如何工作的,并在单元格中向您发送带有"os.system('echo rm -rf *')"
的电子表格。你可能真的不想执行它。