【问题标题】:Cannot pull data from XML files due to differences in format由于格式不同,无法从 XML 文件中提取数据
【发布时间】:2023-03-07 01:00:02
【问题描述】:

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

我可以轻松提取nameacc,因为所有 XML 文件都将它放在树的同一第一级:

path = '/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 标签。即给定种质有 2 种或更多疾病。
  2. diseases 树中有一个disease,这意味着该种质只有一种疾病。 或
  3. diseases 树中根本没有 disease

我需要编写一个可以处理任何三种情况的循环,这就是我失败的地方。到目前为止,这是我的方法:

    #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'] for each x in disease。但是对于那些只有一种疾病的,他们根本没有索引,所以我能提取出那种疾病的名字的唯一方法是doc['metabolite']['diseases']['disease']['name']

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

【问题讨论】:

    标签: python xml keyerror xmltodict


    【解决方案1】:

    试试类似的东西

    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.
    

    【讨论】:

      【解决方案2】:

      找到了一个比较简单的解决方法,我简单的使用try如下方式:

      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'])
      

      【讨论】:

        猜你喜欢
        • 2020-11-20
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        • 2013-07-28
        • 2013-03-20
        • 1970-01-01
        • 2017-06-23
        相关资源
        最近更新 更多