如何拆分fasta文件

时间:2013-07-21 00:26:13

标签: python split fasta

此代码用于从fasta文件中提取和拆分序列

outfile=open('outf','w')
for line in open('input'):
      if line[0]==">":
         outfile.write('\n')
     else:
    outfile.write(line.strip())

   outfile.close()
 all_codons=[]
 for line in open('outf', 'r'):
     seq=line.strip()
     codons = [seq[i:i+3] for i in xrange(0, len(seq), 3) if len(seq[i:i+3])==3]
     all_codons.append(codons)

然后,从分裂的序列中我想取三个序列,其长度为9(9个碱基)例如:

    CGTAACAAG 
    AATCCGGAG 
    CCGCCTCGG

我将第一个序列分成3个碱基的3个子序列,因此,从一个序列中我获得3个子序列,我对其他两个序列做同样的事情。

像这样:

    CGT    AAC     AAG 
    AAT    CCG     GAG 
    CCG    CCT     CGG

示例:

identical_segment('CGT')

我想将这个函数应用于三个序列的每个子序列,然后在所有fasta文件上应用相同的东西。因此,目的是获得矩阵,例如我采用第一个子序列'CGT'并应用函数identical_segment(),它返回28,其余8个子序列也是如此。所以我得到一个矩阵(3,3):

28         2             3
4          23            35
23         4             27

我该怎么办?

2 个答案:

答案 0 :(得分:0)

您的代码中存在一些问题。

首先,您只需要文件中的某些行,抛弃其他行,然后将所需的行输出到文件中。我不确定为什么需要最后一步。直接处理线路效率更高。

def processLines(inputname):
    all_codons=[]
    for line in open(inputname):
        if line[0]==">":
            seq=line.strip()
            codons = [seq[i:i+3] for i in xrange(0, len(seq), 3) if
                      len(seq[i:i+3])==3]
        all_codons.append(codons)
    return all_codons

此外,每次调用same_segment都会生成一个字典,用作从str到分数的映射。呼叫次数可能会变得昂贵。为避免这种情况,您可以尝试两种方法:

code={"a":0,"c":1,"g":2,"t":3} 
def identical_segment(input_string):
   .... # what you have written

或创建一个实例包含字典的类。

要处理多个文件,请执行以下操作:

output = [processLines(filename) for filename in filenames]
# filenames is an iterable

或者如果要将输入名称映射到输出:

outputDict = {filename: processLines(filename) for 
              filename in filenames}

毕竟,在每个输出上调用分析函数并将它们写入输出文件。

总结一下你应该在这篇文章中提到的内容:

  1. 输出文件可能不是最佳选择,因为文件IO很昂贵。如果你把它写到某个文件中,就意味着你必须再次阅读它,这是非常昂贵的。

  2. 不应一遍又一遍地创建同一个对象。校对您的代码以确保不会发生这种情况。

  3. 将主要任务划分为几个小任务,然后想出一个简单直观的方法来开始每个任务。在这个例子中,我们有processfiles->分析 - > output_result

  4. 理解是在Python中迭代事物的有用方法,它更具可读性。您可以搜索列表理解和字典理解以了解更多信息。

  5. 自己尝试一下。我非常乐意在这里阅读您的改进代码。

答案 1 :(得分:0)

尝试使用BioPython从fasta文件中提取核苷酸序列。使用这个包,

from Bio import AlignIO

for record in AlignIO.parse('filename.fasta', 'fasta'):
    print record.id, record.seq

# or store in a new file
seqs = []
for record in AlignIO.parse('filename.fasta', 'fasta'):
    seqs.append(record.seq + '\n')

with open(outfile, 'w') as out:
    out.writelines(seqs)