2012-05-10 93 views
1

我试图创建一个python程序,它读取fasta文件“seqs.fa” ,并让程序按名称排列顺序。按照FASTA文件的顺序排序,按python程序

的FASTA文件看起来是这样的:

>seqA - human 
GCTGACGTGGTGAAGTCAC 
>seqC - gorilla 
GATGACAA 
GATGAAGTCAG 
>seqB - chimp 
GATGACATGGTGAAGTAAC 

我的计划是这样的:

import sys 

inFile = open(sys.argv[1], 'r') 
a = inFile.readlines() 
a.sort() 
seq = ''.join(a[0:]) 
seq = seq.replace('\n', "\n") 
print seq 

预期的结果:

>seqA - human 
GCTGACGTGGTGAAGTCAC 
>seqB - chimp 
GATGACATGGTGAAGTAAC 
>seqC - gorilla 
GATGACAAGATGAAGTCAG 

我的结果:

>seqA - human 
>seqB - chimp 
>seqC - gorilla 
GATGACAA 
GATGAAGTCAG 
GATGACATGGTGAAGTAAC 
GCTGACGTGGTGAAGTCAC 

最后四行是大猩猩,黑猩猩和人类序列,大猩猩序列分成前两行。

任何人都可以给我一些关于如何排序或解决问题的方法?

+1

我有一些提示。首先,使用复制和粘贴,而不是张贴屏幕截图。其次,打开一个交互式的Python解释器 - 如果你不知道如何,[见这里](http://docs.python.org/tutorial/interpreter.html)。现在依次执行这些行中的每一行。通过输入“print a”,“a.sort()”,“打印a”等来查看每个结果。第三,想想为什么'sort'正在做它正在做的事情。然后考虑一下这个文件提供的信息,使你能够做出不同的事情。 – senderle

+0

@senderle您的评论让我在问题上寻找[家庭作业]标签:) –

回答

3

您的代码存在一些问题。主要的一点是,在由readlines()返回的列表中,您的描述和序列都是单独的行,因此当您对列表进行排序时,它们会彼此分离。此外,所有描述都在序列之前,因为它们在开始时有'>'

二,a[0:]a相同。

三,seq.replace('\n', "\n")不会做任何事情。单引号和双引号意味着同样的事情。你用自己替换一个换行符。

读取fasta文件对于Python来说不​​是一项非常复杂的任务,但我仍然希望能够提供使用我工作的软件包 - pyteomics

下面的代码我会使用:

In [1]: from pyteomics import fasta 

In [2]: with fasta.read('/tmp/seqs.fa') as f: 
    ...:  fasta.write(sorted(f)) 
    ...:  
>seqA - human 
GCTGACGTGGTGAAGTCAC 

>seqB - chimp 
GATGACATGGTGAAGTAAC 

>seqC - gorilla 
GATGACAAGATGAAGTCAG 

为了这个保存到一个新的文件,给它的名字fasta.write作为参数:

fasta.write(sorted(f), 'newfile.fa') 

一般来说,pyteomics.fasta是蛋白质序列,不是DNA,但它可以完成这项工作。也许你可以使用它返回元组中描述和序列的事实。

0
file = open("seqs.fa")  
a = file.readlines() 
i = 0 
ar = [] 
while True: 
    l1=file.readline() 
    l2=file.readline() 
    if not (l1 and l2): 
     break; 
    l = l1.strip('\n') + '////////' + l2 
    ar.append(l) 
ar = ar.sort() 
for l in ar: 
    l1 = l.split('////////')[0]+'\n' 
    print l1 
    l2 = l.split('////////')[1] 
    print l2 
5

不要自己实施FASTA阅读器!像大多数情况一样,有一些聪明的人已经为你做了这件事。改为使用例如BioPython。像这样:

from Bio import SeqIO 
handle = open("seqs.fa", "rU") 
l = SeqIO.parse(handle, "fasta") 
sortedList = [f for f in sorted(l, key=lambda x : x.id)] 
for s in sortedList: 
    print s.description 
    print str(s.seq)