3

我有一个带有FASTA格式排序的数据集,基本上是这样的:

>pc284  
ATCGCGACTCGAC

>pc293  
ACCCGACCTCAGC

我想将每个标签用作字典中的键,并将基因存储为值。

这是我拥有的代码,但实际上什么也没做:

import re
fileData = open('d.fasta', 'r')

myDict = dict()

for line in fileData:
  match = re.search('(\>)(\w+)(\r)(\w+)', line)
  if match: 
    gene = match.group(3)
    myDict[gene[0]] = gene[1]

print myDict
4

4 回答 4

2

\r不是有效的字符类,我认为您打算\s改用它。如果您也不使用它们,您可以减少这些组。

但最重要的是,您需要正确提取组:

match = re.search(r'>(\w+)\s+(\w+)', line)
if match:
    tag, gene = match.groups()
    myDict[tag] = gene

通过只创建两个捕获组,我们可以更简单地提取这两个.groups()并直接将它们分配给两个变量,taggene

然而,阅读FASTA 格式似乎表明这是一种多行格式,标签在一行,基因数据在行之后。在那种情况下,你\r的意思是匹配换行符。当您一次读取一行文件时,这将不起作用。

如果没有像这样的正则表达式,读取该格式会简单得多:

myDict = {}

with open('d.fasta', 'rU') as fileData:
    tag = None
    for line in fileData:
        line = line.strip()
        if not line:
            continue
        if line[0] == '>':
            tag = line[1:]
            myDict[tag] = ''
        else:
            assert tag is not None, 'Invalid format, found gene without tag'
            myDict[tag] += line

print myDict

这将逐行读取文件,根据起始>字符检测标签,然后读取行基因信息,将其收集到最近读取的标签下的字典中。

注意rU模式;我们使用 python 的通用换行模式打开文件,以处理用于创建文件的任何换行约定。

最后但并非最不重要的; 看看BioPy 项目;他们的Bio.SeqIO模块可以完美地处理 FASTA 以及许多其他格式。

于 2012-09-26T22:45:05.450 回答
1

我看到两个错误:

您的正则表达式可能是错误的。您的FASTA输入实际上不太可能包含裸回车 ( \r),因此您的正则表达式不会匹配任何内容。因此if match:测试总是错误的,所以什么也没有发生。

此外,在处理每个匹配项时:您将添加的第一个字符gene(即空格)作为键,第二个字符作为值。

您可能打算分别使用第 2 组和第 4 组:

myDict[match.group(2)] = match.group(4)
于 2012-09-26T22:41:51.923 回答
1

不要为此使用正则表达式...

class FASTA(object):
    def __init__(self,data):
        self.data = data.strip().splitlines()
        self.desc = self.data[0]
        self.sequence = "".join(self.data[1:]).replace(" ","")#get rid of spaces
    def  GetCodons(self):
        return [self.sequence[i:i+3] for i in range(0,len(self.sequence),3)]
    def __str__(self):
        return "DESC:'%s'\nSEQ:'%s'"%(self.desc,self.sequence)

with open("data.fasta") as f:
      data = f.read()
parts = data.split(">")
for p in parts[1:]:
    f= FASTA(p)
    print f
    print f.GetCodons()
于 2012-09-26T23:12:30.473 回答
0

除非您的文件太大而无法放入内存(我猜不是),否则整个事情就像

with open('d.fasta') as fp:
    myDict = dict(re.findall(r'(?m)^>(\w+)\s+^(\S+)', fp.read()))
于 2012-09-26T23:07:43.433 回答