【发布时间】:2014-10-31 05:54:08
【问题描述】:
我有一个看起来像这样的 XML 文件:
<?xml version="1.0" encoding ="utf8"?>
<rebase>
<Organism>
<Name>Aminomonas paucivorans</Name>
<Enzyme>M1.Apa12260I</Enzyme>
<Motif>GGAGNNNNNGGC</Motif>
<Enzyme>M2.Apa12260I</Enzyme>
<Motif>GGAGNNNNNGGC</Motif>
</Organism>
<Organism>
<Name>Bacillus cellulosilyticus</Name>
<Enzyme>M1.BceNI</Enzyme>
<Motif>CCCNNNNNCTC</Motif>
<Enzyme>M2.BceNI</Enzyme>
<Motif>CCCNNNNNCTC</Motif>
</Organism>
对于每个Organism,有多个Enzymes 和Motifs。酶是独一无二的,但基序可以重复。所以我尝试创建一个以酶为键,以主题为值的字典。这是我的代码:
import xml.etree.ElementTree as ET
def lister():
tree = ET.parse('rebase.xml')
rebase = tree.getroot()
data_dict = {}
for each_organism in rebase.findall('Organism'):
try:
enzyme = each_organism.find('Enzyme').text
except AttributeError:
continue
for motif in each_organism.findall('Motif'):
motif = motif.text
data_dict[enzyme] = motif
return data_dict
然而,字典似乎省略了相当多的条目。我似乎可以理解问题所在。任何帮助将不胜感激。
编辑
一个用户发了一个解决方案,后来又删了,不过我可以及时复制:
for each_organism in rebase.findall('Organism'):
try:
enzyme = each_organism.find('Enzyme').text
except AttributeError:
continue
data_dict[enzyme] = []
for motif in each_organism.findall('Motif'):
data_dict[enzyme].append(motif.text)
return data_dict
但是在这种情况下返回的字典是错误的,原因如下:
酶-基序对是独一无二的。这样 1 种酶只有 1 个基序。在我的文件中,一个酶只出现一次,一个基序可以出现多次,但它属于不同的酶,所以这对是独一无二的。 EDIT 下的代码是这样的:
假设和酶 - M.APaI 带有主题 GATC 和另一个 M.APaII 带有主题 TCAG。两种酶非常相似(仅在最后一个字符I 上有所不同)。该代码将两个基序与第一个酶结合,产生{M.ApaI :['GATC','TCAG']}
【问题讨论】:
-
您似乎只在每个生物体中寻找第一个
Enzyme,然后遍历所有Motifs,无论它们是否属于该酶。你确定这是对的吗?然后(这会导致数据丢失)您覆盖Enzyme的所有Motifs - 但即使您构建所有Motifs 的列表,它们仍然会绑定到错误的Enzyme.. .
标签: python xml dictionary