2015-07-13 4 views
1

Я относительно новичок в Python. У меня много файлов, и для каждого из них я хочу создать словарь с информацией о файле. Мой текущий код заключается в следующем:Как создать уникальные словари в цикле for в Python?

thespefiles = glob.glob('*.SPE') 
for filename in thespefiles: 
    barename = filename.replace('.SPE', '') 
    #does operation to retrieve outputwpsx and outputwpsz 
    #does operation to retrieve value 

    barename +'_dictionary' = { 
     'filename': filename, 
     'barename': barename, 
     'readcounts': value, 
     'wpsx': outputwpsx, 
     'wpsz': outputwpsz, 
    } 

Однако, он приходит с ошибкой с линией barename + '_dictionary' говоря:

"Syntax Error: can't assign to operator".

Я понимаю, что словари, как правило, назначается без кавычек, но когда я barename_dictionary вместо этого, он сказал:

"NameError: name 'plate2_008_006_dictionary' not defined"

(plate2_008_006 является одним из конкретных barenames), когда я проверил его вне всего цикла.

SO, мой вопрос, есть ли способ создать кучу уникальных словарей из одного цикла? Я везде искал.

ответ

3

Просто поместите свой внутренний dicts внутри внешнего Dict:

thespefiles = glob.glob('*.SPE') 
file_dict = {} 
for filename in thespefiles: 
    barename = filename.replace('.SPE', '') 
    #does operation to retrieve outputwpsx and outputwpsz 
    #does operation to retrieve value 

    file_dict[barename] = { 
     'filename': filename, 
     'barename': barename, 
     'readcounts': value, 
     'wpsx': outputwpsx, 
     'wpsz': outputwpsz, 
    } 

Динамические имена переменных можно, но следует избегать. Для таких случаев лучше использовать структуру данных контейнера, такую ​​как dict, чтобы ключ к внутреннему dicts, который вы строите.

0

Зачем вам это делать? У вас будет множество новых переменных, и вам будет трудно их распознать и получить. Код, который вы указали, ни первый, ни второй действительны. Вы пытались присвоить новое значение строке (barename + "_ dictionary"), что невозможно. Вы можете присвоить только новое значение переменной или объекту с помощью метода setitem() (например, словаря, списка, ...). Во втором случае вы помещали каждый новый словарь в переменную с именем «barename_dictionary». Поскольку уже существует баренгейм, произошло нечто странное. Почему это породило ошибку, я не уверен. Теоретически этого не должно было быть. Но, очевидно, это произошло, и это плохо.

Однако, это то, что вы хотели бы сделать, возможно. Вот как это делается.

# There are two ways: 
# 1. Construct the code string and execute it: 
codestr = barename+"_dictionary = " 
codestr += "{'barename': 'blah-blah', 0: 1234}" 
exec codestr 
# Or (2.), simply add the new variable with a dictionary manually to a wanted namespace: 
globals()[barename+"_dictionary"] = {"barename": "blah-blah"} 

# In both cases variable names have to be within Python naming rules. 
# Your filenames are a little odd for that. Change them! 

Голые в виду, что сказал kojiro. Если вам действительно не нужно, НЕ ДЕЛАЙТЕ ЭТО!

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