我的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://...\"")
是不可能的。这句话有什么问题?
答案 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
)。