2015-11-23 3 views
1

Мне сказали, что использование exec - очень плохая вещь.Python - заменить exec для создания динамической переменной

Однако я новичок в python и пытаюсь выяснить, как динамически создавать кучу глобальных переменных (я знаю, что это также должно быть Bad Thing, но давайте сжечь один мост за раз , А не ___ ли нам?).

Что это такое: получить список текущих переменных, которые необходимо создать (в настоящее время находится в CSV), получить уникальные идентификаторы в этом списке, а затем создать необходимые объекты, добавив идентификатор к имени и считывая содержимое другого CSV.

import pandas as pd 

def importtest(): 
    ilist = pd.read_csv('Z:/fakepath/ID.csv') 
    for i in range(0, len(ilist['ID'].unique())): 
     tempID = ilist['ID'].unique()[i] 
     exec("variable%s = pd.read_csv('%s')" % (
      str(tempID), 'Z:/fakepath/'+str(tempID)+'.csv'), globals()) 
     i = i + 1 

Есть еще один/лучший способ для динамического создания/обновления переменных, мне нужно, чтобы они появляются в глобальном масштабе?

+2

Как вы, кажется, чтобы быть в курсе, что это не хорошая идея. почему ты хочешь сделать это? Просто создайте глобальный словарь под названием 'variable', а затем выполните' variable [tempID] = whatever'. Какая у вас проблема, которая не решает? – BrenBarn

+0

Похоже, это решает обе мои проблемы. Благодаря! –

+1

@BrenBarn, может также написать это как ответ, чтобы исходный плакат мог отметить его правильно. Несколько второстепенных комментариев - я не думаю, что вам нужна строка 'i = i + 1', так как ваш' i' уже завершает цикл. Кроме того, я думаю, что было бы чище писать 'для temp_id в ilist ['ID']. Unique():' вместо создания индекса. Значения id - это все, о чем вы действительно заботитесь, поэтому просто перебирайте их. – dslack

ответ

1

строковые ключи в globals() словаре соответствуют именам переменных, поэтому вам не нужно использовать exec, вы можете написать переменную глобалам хэш непосредственно:

 globals()["variable" + str(tempID)] = pd.read_csv('Z:/fakepath/'+str(tempID)+'.csv') 
+0

Почему вы проголосовали за это? – dslack

+0

Принимая этот ответ, потому что, хотя комментарий БренБарна решил мою проблему, я чувствую, что этот ответ на самом деле является более близким решением моего вопроса, как было задано. –

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