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

0 投票
2 回答
558 浏览
提问于 2025-04-17 08:24

我有一些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

撰写回答