我有一个脚本,它需要一堆 XML 文件,所有格式都是:HMDB61152.xml
并将它们全部拉入 using glob
. 对于每个文件,我需要提取每个文件的一些详细信息,例如accession
、name
和diseases
. 解析我使用的每个 XML,xmltodict
因为我传统上喜欢使用列表而不是 XML 文件,尽管由于我面临的问题,我可能需要改变我的策略。
我能够轻松地提取name
,acc
因为所有 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']
所以基本上在这一点上,疾病信息有三个选项:
- 每棵树中有多个
disease
标签。diseases
即,给定的种质有两种或多种疾病。 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']
对于疾病中的每个x。但是对于那些只有一种疾病的,他们根本没有索引,所以我能提取出那种疾病的名字的唯一方法就是做doc['metabolite']['diseases']['disease']['name']
。
该脚本失败是因为一旦我们遇到只有一种疾病的案例,它就会在尝试测试 if 时返回 KeyError doc['metabolite']['diseases']['disease'][0]) == True
。如果有人可以帮助我解决这个问题,那就太好了,或者指导我采取更合适的策略。