У меня есть сценарий, который принимает кучу XML-файлов, всего в виде: HMDB61152.xml
и вытаскивает их все с помощью glob
. Для каждого файла мне нужно собрать некоторые сведения о каждом из них, например accession
, name
и список diseases
. Чтобы анализировать каждый XML, я использовал xmltodict
, потому что мне традиционно нравится работать со списками вместо XML-файлов, хотя мне, возможно, придется изменить мою стратегию из-за проблем, с которыми я сталкиваюсь.Невозможно вытащить данные из файлов XML из-за различий в формате
Я могу вытащить name
и acc
легко, так как все XML-файлы имеют его в том же первом уровне дерева:
р ath = '/Users/me/Downloads/hmdb_metabolites' for data_file in glob.glob(os.path.join(path,'*.xml')): diseases=[] with open(data_file) as fd: doc = xmltodict.parse(fd.read()) name = doc['metabolite']['name'] acc = doc['metabolite']['accession']
Так в основном на данный момент есть три варианта болезни информация:
- В каждом из
diseases
тегов есть несколько метокdisease
. I. Есть 2 или более заболеваний для данного присоединения. - Существует
disease
в деревеdiseases
, что означает, что вступление имеет только одну болезнь. или - Нет
disease
в деревеdiseases
вообще.
Мне нужно написать цикл, который может обрабатывать любые три случая, и вот где я терпит неудачу. Вот мой подход до сих пор:
#I get the disease root, which returns True if it has lower level items (one or more disease within diseases)
#or False if there are no disease within diseases.
dis_root=doc['metabolite']['diseases']
if (bool(dis_root)==True):
dis_init = doc['metabolite']['diseases']['disease']
if (bool(doc['metabolite']['diseases']['disease'][0]) == True):
for x in range(0,len(dis_init)):
diseases.append(doc['metabolite']['diseases']['disease'][x]['name'])
else:
diseases.append(doc['metabolite']['diseases']['disease']['name'])
else:
diseases=['None']
Так что проблема, в случае, когда есть несколько заболеваний, мне нужно вытащить их имена в следующем формате: doc['metabolite']['diseases']['disease'][x]['name']
для каждого х при заболеваниях. Но для тех, у кого есть только одно заболевание, у них нет индекса вообще, поэтому единственный способ, которым я могу назвать название этой болезни, - это делать doc['metabolite']['diseases']['disease']['name']
.
Сценарий терпит неудачу, потому что, как только мы сталкиваемся с случаем только одного заболевания, он возвращает KeyError, когда он пытается проверить, doc['metabolite']['diseases']['disease'][0]) == True
. Если кто-нибудь может помочь мне понять это, это будет здорово или направит меня на более подходящую стратегию.