我有一个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 namemotif放在一起。我尝试使用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

10-08 17:57