2014-02-13 3 views
2

Я использую парсер, который считывает из текстового файла и возвращает dicts как это:Копирование dicts из CSV в новый Dict-питон

{'m/z array': array([ 345.1, 370.2, 460.2, 1673.3, 1674. , 1675.3]), 
'charge array': array([ 3, 2, 1, 1, 1, 1]), 
'params': {'username': 'Lou Scene', 'useremail': '[email protected]', 
'mods': 'Carbamidomethyl (C)', 'itolu': 'Da', 'title': 'Spectrum 2', 
'rtinseconds': '25', 'itol': '1', 'charge':`enter code here` '2+ and 3+', 
'mass': 'Monoisotopic', 'it_mods': 'Oxidation (M)', 
'pepmass': (1084.9, 1234.0), 
'com': 'Based on http://www.matrixscience.com/help/data_file_help.html', 
'scans': '3'}, 
'intensity array': array([ 237., 128., 108., 1007., 974., 79.])} 

Я пытаюсь прочитать весь файл (все dicts) и хранить их в объекте для передачи второй функции, поэтому скрипту не нужно читать из файла каждый раз (что очень медленно). Я хотел бы сохранить исходную структуру данных, передавая их для облегчения доступа. Каков наилучший способ сделать это?

Я попытался, используя следующий код:

print ('enter mgf file name') 
mgf_file = str(raw_input()) 
from pyteomics import mgf 
reader = [] 
with mgf.read(mgf_file) as temp_read: 
    for things in temp_read: 
     reader.update(things) 


compo_reader(reader) 
+0

Какой парсер вы используете? Как выглядит код для его использования? – abarnert

+0

Вам по-прежнему нужно показать нам свой код, а не заставлять нас читать документы и пытаться угадать, какой код вы могли бы написать в этой библиотеке. См. [MCVE] (http://stackoverflow.com/help/mcve) для получения дополнительной информации о том, что делает хороший вопрос. – abarnert

+1

Жаль об этом! Я новичок в этом веб-сайте и программировании и все еще изучаю, как это сделать должным образом. Я редактировал свой оригинальный пост. Спасибо, что ответили. – kkhatri99

ответ

2

Просто поместите их в список и передать список вокруг.

Поскольку вы не указали нам свой код, я не могу показать вам, как его изменить, но я могу показать вам какой-то поддельный код.

Предположим, у вас есть функция parser(f), которая читает одну строку от f и возвращает один из тех словарей, которые вы нам показали, или None, когда это будет сделано. Итак:

with open(filename, 'rb') as f: 
    things = [] 
    while True: 
     thing = parser(f) 
     if not thing: 
      break 
     things.append(thing) 

Или, более компактно:

with open(filename, 'rb') as f: 
    things = list(iter(partial(parser, f), None)) 

Если вы используете парсер, который уже итератора, как csv.DictReader, то это еще проще:

with open(filename, 'rb') as f: 
    reader = csv.DictReader(f) 
    things = list(reader) 

Однако вы сделали это, как только у вас есть список этих словарей, вы можете передать этот список, перебрать его и т. д.


Для вашего конкретного кода, он выглядит как mgf.read() объект итератор над словарями, так же, как csv.DictReader, так что это должно быть просто:

with mgf.read(mgf_file) as temp_read: 
    reader = list(temp_read) 

Если это не так, вы бы хочу сделать это:

reader = [] 
with mgf.read(mgf_file) as temp_read: 
    for thing in temp_read: 
     reader.append(thing) 

другими словами, вместо того, чтобы многократно вызывая update на Dict с каждым новым Словаре, просто append каждый один к списку.

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