2011-12-14 1 views
0

У меня есть файлы CSV, которые содержат многочисленные значения, которые я хочу ссылаться. Я хотел разобрать их лаконично, используя eval. Вот что я пробовал:Настройка свойств из файла CSV с использованием eval (Python)

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://...\""). Что не так с этим утверждением?

+1

Есть ли причина, по которой вы не используете 'csv' модуль? http://docs.python.org/library/csv.html – Wilduck

+0

Я новичок в python. Позвольте мне посмотреть, поддерживается ли этот модуль в моей среде (WAS 6). Вопрос все еще стоит, академически. – Synesso

+3

Вы почти наверняка хотите словарь вместо создания переменных в глобальной области с помощью 'eval'. Модуль 'csv' имеет очень полезный класс' DictReader'. http://docs.python.org/library/csv.html#csv.DictReader Кроме того, модуль 'csv' находится в стандартной библиотеке Python с версии 2.3. – Wilduck

ответ

2

eval() для оценки Python выражения и присваивания (a = 1) является заявление. Вам понадобится exec().

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

(FYI, чтобы использовать eval() вы должны сделать externalProviderURL=eval("\"tibjmsnaming://...\""), но это выглядит как ваша ситуация больше подходит для exec).

+2

Если вы _really_ знаете, что делаете, 'exec' почти всегда является неправильным инструментом для работы. – ekhumoro

+0

согласен. это опасно. –

4

Согласно предложению С.Лотта, я хотел бы решить эту проблему. Я мог бы немного упростить. Если да, извиняюсь, но я не видел ваших данных.

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's with statement, что является хорошей привычкой работать с файлами. Во-вторых, я использую модуль csv python для создания объекта-читателя, который вы можете перебирать в цикле for. Это значительно больше pythonic, чем использование цикла while. Наконец, и, вероятно, наиболее уместно, я добавляю эти значения в словарь, а не пытаюсь перевернуть их в переменные в глобальной области. Чтобы получить доступ к этим параметрам, вы можете просто сделать следующее:

my_dict['externalProviderURL'] 

Однако вы получаете намного больше, чем это. Сохранение ваших значений в фактической структуре данных позволит вам использовать все его built in methods. Например, вы можете вернуться назад и перебирать ключи это и значения

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

Pythonic код часто включает значительное использование словарей. Они отлично настроены для производительности и особенно полезны, поскольку большинство из них можно сохранить в качестве значения в словаре (списки, другие словари, функции, классы и т. Д.).

+0

Спасибо Wilduck. Я сгорел exec после добавления значения в CSV-файл, который не был буквенно-цифровым. например 'Это-that.1.2.3. Поэтому я попытался импортировать модуль csv и использовать ваш подход, но этот модуль недоступен для меня в WebSphere 6. Не уверен, что я вручную добавлю его в свою среду. Как я могу это сделать? Также синтаксис 'with' не работал. Уверен, у меня очень старая версия. – Synesso

+0

Я мало что знаю о IBM WebSphere. Однако похоже, что вы на самом деле работаете с Jython 2.1 (http://wiki.python.org/jython/WebSphere). Если это так, вы можете начать поиск java-библиотек для работы с файлами csv. – Wilduck

Смежные вопросы