由于格式不同

时间:2016-12-04 21:26:13

标签: python xml keyerror xmltodict

我有一个脚本需要一堆XML文件,所有这些文件都采用HMDB61152.xml的形式,并使用glob将它们全部拉入。对于每个文件,我需要提取有关每个文件的详细信息,例如accessionnamediseases列表。要解析我使用xmltodict的每个XML,因为我传统上喜欢使用列表而不是XML文件,尽管由于我所面临的问题,我可能需要更改策略。

我可以轻松地提取nameacc,因为所有XML文件都在树的同一级别中:

p 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. 每个disease树中有多个diseases个标记。即,对于给定的种质,有2种或更多种疾病。
  2. disease树中有一个diseases表示加入只有一种疾病。 或
  3. disease树中根本没有diseases
  4. 我需要编写一个可以处理任何三种情况的循环,这就是我失败的地方。到目前为止,这是我的方法:

        #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']对于疾病中的每个x。但是对于那些只有一种疾病的人来说,他们根本就没有指数,所以我唯一可以得出这种疾病的名字就是doc['metabolite']['diseases']['disease']['name']

    脚本失败,因为一旦我们遇到只有一种疾病的情况,它会在尝试测试doc['metabolite']['diseases']['disease'][0]) == True时返回KeyError。如果有人能帮我解决这个问题,那就太好了,或者指导我采取更合适的策略。

1 个答案:

答案 0 :(得分: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'])