使用eval从CSV文件设置属性(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 个回答
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
语句,这是处理文件时一个很好的习惯。其次,我使用了Python的csv
模块来创建一个读取对象,这样你可以在一个for
循环中逐行读取。这种方式比用while
循环要更符合Python的风格。最后,也是最重要的一点,我把这些值存储在一个字典里,而不是试图把它们放到全局变量中。要访问这些参数,你只需要这样做:
my_dict['externalProviderURL']
不过,你得到的远不止这些。把你的值存储在一个实际的数据结构中,可以让你使用它所有的内置方法。比如,你可以回过头来遍历它的键和值。
for key, value in my_dict.iteritems():
print key
print value
在Python中,代码通常会大量使用字典。字典经过精心设计,性能很好,而且特别有用,因为几乎任何东西都可以作为字典中的值存储(比如列表、其他字典、函数、类等等)。
2
eval()
是用来计算 Python 中的 表达式,而赋值(比如 a = 1
)则属于 语句。所以你应该使用 exec()
。
>>> exec("externalProviderURL=\"tibjmsnaming://...\"")
>>> externalProviderURL
'tibjmsnaming://...'
顺便说一下,如果你想用 eval()
,你需要这样写 externalProviderURL=eval("\"tibjmsnaming://...\"")
,但看起来你的情况更适合用 exec
。