我有一个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
和{
然而这本词典似乎漏掉了不少词条。我似乎能理解问题所在。任何帮助都将不胜感激。在
编辑
一个用户发布了一个解决方案,但随后将其删除,但我可以及时复制:
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
然而,在这种情况下返回的措辞是错误的,原因如下:
酶-基序对是独一无二的。使一种酶只有一个基序。在我的文件中,一种酶只发生一次,一个基序可以出现多次,但它属于不同的酶,所以这对酶是独一无二的。编辑下的代码的作用是:
假设和酶-M.APaI
带基序GATC
,另一个M.APaII
带基序TCAG
。这两种酶非常相似(只在最后一个字符I
)上有所不同。该密码将两个基序与第一个产生{M.ApaI :['GATC','TCAG']}
的酶结合
我看到的第一个大问题是,你只在任何给定的生物体内寻找第一种酶。如果你想找出每种酶的发生率,你应该使用:
第二个问题是XML的格式与您似乎要用字典构建的数据关系不匹配。在XML中,Enzyme、Motif和Name都是有机体的子级,但是您将Motif指定为与酶键相关联的值。你不可能知道,必然的,当你在迭代的时候,一个应该和另一个相关联,因为它们都被挤在一起,对象中没有任何逻辑分离。在
我可能误解了您的目的,但似乎最好通过构造有机体和酶类对象来帮助您,而不是将两个(显然)不相关的概念强制转换为键-值关系。在
这可能是这样的,并且封装了您的字段:
^{pr2}$你的酶对象:
所有这些仍然需要对XML文件进行某种更改。除非您只需逐行解析(这显然不是XML的重点),否则我想不出任何简单的方法,您现在就无法确定哪些基序属于哪种酶。在
编辑:当你询问如何在每个酶节点中盲目地迭代,假设你总是有一个名字元素,每个酶都有一个基序,名字后面的每个元素都是酶,那么Motif(例如e-M-e-M等等),你应该能够做到:
然后,假设我提出的每一个假设,可能还有更多的假设(我甚至不能百分之百地肯定etree总是自上而下地迭代元素),这是真的,模体中任何给定索引的任何基序都属于酶中同一索引的酶。万一我还没说清楚:这是一个非常脆弱的代码。在
相关问题 更多 >
编程相关推荐