2016-12-04 2 views
0

У меня есть сценарий, который принимает кучу 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']

Так в основном на данный момент есть три варианта болезни информация:

  1. В каждом из diseases тегов есть несколько меток disease. I. Есть 2 или более заболеваний для данного присоединения.
  2. Существует disease в дереве diseases, что означает, что вступление имеет только одну болезнь. или
  3. Нет 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. Если кто-нибудь может помочь мне понять это, это будет здорово или направит меня на более подходящую стратегию.

ответ

0

Try что-то вроде

if 0 in doc['metabolite']['diseases']['disease']: 
    pass # if 0 is a key in the array, we have multiple entries 
else 
    pass # only a single item. 
0

Нашли относительно легко обойти, я просто использую попробовать следующим образом:

try: 
      for x in range(0,len(dis_init)): 
        diseases.append(doc['metabolite']['diseases']['disease'][x]['name']) 
      except KeyError: 
       diseases.append(doc['metabolite']['diseases']['disease']['name'])