从XML文件创建字典

2024-05-20 22:36:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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和{}。酶是独特的,但模体可以重复。因此,我试图创建一个以酶为键,以motif为值的字典。这是我的代码:

^{pr2}$

然而这本词典似乎漏掉了不少词条。我似乎能理解问题所在。任何帮助都将不胜感激。在

编辑

一个用户发布了一个解决方案,但随后将其删除,但我可以及时复制:

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']}的酶结合


Tags: 文件namedatarebasedicteachmotif基序
1条回答
网友
1楼 · 发布于 2024-05-20 22:36:50

我看到的第一个大问题是,你只在任何给定的生物体内寻找第一种酶。如果你想找出每种酶的发生率,你应该使用:

 for enzyme in each_organism.findall('Enzyme'):
     # add to dictionary here

第二个问题是XML的格式与您似乎要用字典构建的数据关系不匹配。在XML中,Enzyme、Motif和Name都是有机体的子级,但是您将Motif指定为与酶键相关联的值。你不可能知道,必然的,当你在迭代的时候,一个应该和另一个相关联,因为它们都被挤在一起,对象中没有任何逻辑分离。在

我可能误解了您的目的,但似乎最好通过构造有机体和酶类对象来帮助您,而不是将两个(显然)不相关的概念强制转换为键-值关系。在

这可能是这样的,并且封装了您的字段:

^{pr2}$

你的酶对象:

class Enzyme:
    # where motifs is an iterable of string
    def __init__(self, motifs):
        self.motifs = motifs

所有这些仍然需要对XML文件进行某种更改。除非您只需逐行解析(这显然不是XML的重点),否则我想不出任何简单的方法,您现在就无法确定哪些基序属于哪种酶。在

编辑:当你询问如何在每个酶节点中盲目地迭代,假设你总是有一个名字元素,每个酶都有一个基序,名字后面的每个元素都是酶,那么Motif(例如e-M-e-M等等),你应该能够做到:

i = 0
enzymes = []
motifs = []

for element in each_organism:
    # skip the first Name child
    if i == 0:
        continue
    # if we're at an odd index, indicating an enzyme
    if i % 2 == 1:
        enzymes.append(element.text)
    # if we're at an even index, indicating the related motif
    elif i % 2 == 0:
        motifs.append(element.text)

    i += 1

然后,假设我提出的每一个假设,可能还有更多的假设(我甚至不能百分之百地肯定etree总是自上而下地迭代元素),这是真的,模体中任何给定索引的任何基序都属于酶中同一索引的酶。万一我还没说清楚:这是一个非常脆弱的代码。在

相关问题 更多 >