使用eval(Python)从CSV文件设置属性

时间:2011-12-14 23:44:57

标签: python

我的CSV文件包含我想要引用的众多值。我想用eval简洁地解析它们。这是我试过的:

line = fileHandle.readline()
while line != "":
  if line != "\n":
    parameter = line.split(',')[0]
    value = line.split(',')[2].replace("\n", "")
    eval("%s = \"%s\"" % (parameter, value))
    print(parameter + " = " + eval(parameter)) # a quick test
  line = fileHandle.readline()

我得到的是:

Traceback (innermost last):
  File "<string>", line 73, in ?
  File "<string>", line 70, in createJMSProviders
  File "<string>", line 49, in createJMSProviderFromFile
  File "<string>", line 1
    externalProviderURL="tibjmsnaming://..."
                       ^
SyntaxError: invalid syntax
我告诉我,eval("externalProviderURL=\"tibjmsnaming://...\"")是不可能的。这句话有什么问题?

2 个答案:

答案 0 :(得分:4)

根据S.Lott的建议,以下是我将如何解决这个问题。我可能会简化一点。如果是这样,我道歉,但我还没有看到你的数据。

import csv
my_dict = {}
with open('my/data.csv') as f:
    my_reader = csv.reader(f)
    for row in my_reader:
        my_dict[row[0]] = row[2]

正如您所看到的,这里的代码存在许多差异。首先,我使用的是Python with statement,这是处理文件时的一个好习惯。其次,我使用python的csv模块来创建一个reader对象,你可以在for循环中迭代它。这比使用while循环更加pythonic。最后,也许最相关的是,我将这些值添加到字典中,而不是试图将它们填充到全局范围内的变量中。要访问这些参数,您只需执行以下操作:

my_dict['externalProviderURL']

然而,你得到的远不止这些。将您的值存储在实际数据结构中将允许您使用它的所有built in methods。例如,您可以返回并迭代它的键和值

for key, value in my_dict.iteritems():
    print key 
    print value

Pythonic代码通常涉及字典的重要使用。它们的性能得到了很好的调整,并且特别有用,因为大多数东西都可以存储为字典中的值(列表,其他字典,函数,类等)。

答案 1 :(得分:2)

eval()用于评估Python 表达式,而赋值(a = 1)是语句。 你需要exec()

>>> exec("externalProviderURL=\"tibjmsnaming://...\"")
>>> externalProviderURL
'tibjmsnaming://...'

(仅供参考,使用eval()您必须externalProviderURL=eval("\"tibjmsnaming://...\""),但看起来您的情况更适合exec)。