在python脚本中从外部数据创建变量

在python脚本中从外部数据创建变量,python,scripting,Python,Scripting,我想读取外部数据源(excel)并创建包含数据的变量。假设数据在列中,并且每列都有一个带有变量名的标题 我的第一个想法是编写一个函数,这样我就可以轻松地重用它。此外,我可以很容易地提供一些额外的关键字参数,使函数更通用 我面临的问题是,我想通过变量名(以交互方式)引用python中的数据。我不知道(用函数)怎么做。我看到的唯一解决方案是从函数中返回变量名和数据(如列表),并执行以下操作: def get_data() (...) return names, values nam

我想读取外部数据源(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']))
我能直接得到同样的结果吗? 谢谢
Roel

如果只想为名称中的每个名称设置局部变量,请使用:

for n, v in zip(names, values):
    locals()[n] = v
如果您希望使用单个对象来访问数据,这会更干净,那么只需使用dict,然后从函数中返回

def get_data():
    (...)
    return dict(zip(names, values))
要访问名称“a”的值,只需使用
get_data()[“a”]

最后,如果要将数据作为对象的属性进行访问,可以更新对象的
\uuu dict\uuu
(如果任何列名等于任何列名,则可能会发生意外行为)


如果只想为名称中的每个名称设置局部变量,请使用:

for n, v in zip(names, values):
    locals()[n] = v
如果您希望使用单个对象来访问数据,这会更干净,那么只需使用dict,然后从函数中返回

def get_data():
    (...)
    return dict(zip(names, values))
要访问名称“a”的值,只需使用
get_data()[“a”]

最后,如果要将数据作为对象的属性进行访问,可以更新对象的
\uuu dict\uuu
(如果任何列名等于任何列名,则可能会发生意外行为)


使用字典存储从名称到值的映射,而不是创建局部变量

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)

使用字典存储从名称到值的映射,而不是创建局部变量

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)

传统的方法是将键/值对填充到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*)”
的电子表格。您可能真的不想执行它。

传统的方法是将键/值对填充到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*)”
的电子表格。您可能并不真的想执行它。

这是一个清楚的例子,说明为什么使用exec确实是危险的。我不知道你的代码是做什么的,但我想我不想尝试:-)好吧,/这个/只是一个无害的小打印语句,所以如果有人复制并粘贴它以查看它是否真的有效,我就不会受到责备。:-)这就是为什么使用exec确实是危险的一个明显的例子。我不知道你的代码是做什么的,但我想我不想尝试:-)好吧,/这个/只是一个无害的小打印语句,所以如果有人复制并粘贴它以查看它是否真的有效,我就不会受到责备。:-)谢谢你的回答。你说更新globals()被认为是不好的做法。@lazyr给出的答案似乎也一样,但是对于局部变量,这看起来是一个很好的中间解决方案,或者这也被认为是一种不好的做法?更改
locals()
也经常被认为是不好的做法,因为您无法通过读取代码轻松推断定义了哪些变量(更新
globals()时情况更糟)
)。这违背了最小意外原则,并且会使代码更难理解。如果这只是一个小脚本,那么它可能是好的,但是对于更大的应用程序,你应该考虑其他的替代方法。我想在这种情况下,我可以忍受它:我想使用MATLAB中的变量来以尝试/错误的方式制作图表。键入plt.plot(Temp1)比键入plt.plot(d.Temp1)(如果d是字典)更容易。(顺便说一句,我该如何设置这个评论部分的代码格式?)。你说更新globals()被认为是不好的做法。@lazyr给出的答案似乎也一样,但对于局部变量,这看起来是一个很好的中间解决方案,或者这也被认为是不好的做法?更改
locals()
也经常被认为是不好的做法,因为您无法轻松推断