Я не уверен, что мой заголовок правильный для того, что я ищу, но я думаю, что ссылка - это проблема.
У меня есть объект Reader, с помощью которого я могу выполнить цикл:
msrun = pymzml.run.Reader(mzmlFile)
for feature in msrun:
print feature['id']
С этим кодом я получаю идентификаторы, начиная с 1, всех функций в msrun. Однако мне нужно сначала пройтись по коду и получить все нужные мне ключи и поместить их в список, например:
def getKeys(msrun, excludeList):
spectrumKeys = []
done = False
for spectrum in msrun:
if done:
break
if spectrum['ms level'] == 2:
for key in spectrum:
if key not in excludeList and not key.startswith('MS:'):
done = True
spectrumKeys.append(key)
spectrumKeys.extend(spectrum['precursors'][0].keys())
precursorKeys = spectrum['precursors'][0].keys()
break
return spectrumKeys, precursorKeys
Однако, если бы я запустил этот код:
msrun = pymzml.run.Reader(mzmlFile)
specKeys, precursKeys = getKeys(msrun, ['title','name'])
for feature in msrun:
print feature['id']
начинается с идентификатора, который не был в цикле в getKeys () (он начинается с 11 вместо 1). Так что я думаю, pymzml.run.Reader () работает как объект генератора. Поэтому я попытался скопировать объект. Сначала я попробовал
copyMsrun = msrun
specKeys, precursKeys = getKeys(copyMsrun, ['title','name'])
Но это создает ту же проблему, если я правильно понял, потому что copyMsrun = msrun заставляет их указывать на одно и то же.
Тогда я попробовал
import copy
copyMsrun = copy.copy(msrun)
Но у меня все еще была та же проблема. Я использовал copy.copy вместо copy.deepcopy, потому что я не думаю, что объекты Reader содержат другие объекты, и когда я пытаюсь сделать глубокую копию, я получаю
TypeError: object.__new__(generator) is not safe, use generator.__new__().
Так как же сделать Я копирую объект, чтобы цикл одного не влиял на другой? Должен ли я просто сделать
msrun = pymzml.run.Reader(mzmlFile)
copyMsrun = pymzml.run.Reader(mzmlFile)
Edit:
Что касается комментария Ade YU, я тоже это попробовал, но когда я делаю
spectrumList = []
for spectrum in msrun:
print spectrum['id']
spectrumList.append(spectrum)
for spectrum in spectrumList:
print spectrum['id']
Первый отпечаток дает мне 1-10, а второй - 10 раз 10