我有一个XML
文件,看起来像这样:
<Organism>
<Name>Bacillus halodurans C-125</Name>
<Enzyme>M.BhaII</Enzyme>
<Motif>GGCC</Motif>
<Enzyme>M1.BhaI</Enzyme>
<Motif>GCATC</Motif>
<Enzyme>M2.BhaI</Enzyme>
<Motif>GCATC</Motif>
</Organism>
<Organism>
<Name>Bacteroides eggerthii 1_2_48FAA</Name>
</Organism>
我正在尝试将其写入
CSV
文件,如下所示:Bacillus halodurans, GGCC
Bacillus halodurans, GCATC
Bacillus halodurans, GCATC
Bacteriodes,
我解决此问题的方法是创建一个元组列表,其中将
organism name
和motif
放在一起。我尝试使用ElementTree
模块进行此操作:import xml.etree.ElementTree as ET
tree = ET.parse('file.xml')
rebase = tree.getroot()
list = []
for organisms in rebase.findall('Organism'):
name = organisms.find('Name').text
for each_organism in organisms.findall('Motif'):
try:
motif = organisms.find('Motif').text
print name, motif
except AttributeError:
print name
但是我得到的输出看起来像这样:
Bacillus halodurans, GGCC
Bacillus halodurans, GGCC
Bacillus halodurans, GGCC
仅第一个
motif
被记录。这是我第一次使用ElementTree
,因此有些混乱。任何帮助将不胜感激。我不需要写入
CSV
文件的帮助。 最佳答案
您唯一需要修复的是替换:
motif = organisms.find('Motif').text
与:
motif = each_organism.text
您已经在
Motif
中的Organism
节点之间进行迭代。 each_organism
循环变量保存Motif
标记的值。我还将更改变量名称以避免混淆。另外,我看不到在
try/except
标记循环内需要Motif
的情况。如果可能缺少name
标记,则可以遵循“请求宽恕,而不是许可”的方法并捕获错误:for organism in rebase.findall('Organism'):
try:
name = organism.find('Name').text
except AttributeError:
continue
for motif in organism.findall('Motif'):
motif = motif.text
print name, motif