切片fasta文件

时间:2013-07-27 22:33:49

标签: python fasta

帮助我,

我有一个fasta文件我想对它应用一些操作。我想我的文件包含500个序列,for i=1 to 500我想要三个序列并应用一些函数,所以我会做同样的操作在166次,每次我采取3个序列

for i=1 to 500 do (500 number of sequences in fasta file)

take 3 sequences

    apply some functions

示例: 我的文件包含9个序列

   1-tatctattaccc

   2-gctgcgataagc

   3-tcctacttttgt

   4-caggaaaagaaa

   5-actgaatccctt

   6-ctgaagttgact

   7-aggtttgaagtg

   8-aacttccaactc

   9-gaaaagcaccct

我采取前3个序列

       seq1-tatctattaccc

       seq2-gctgcgataagc

       seq3-tcctacttttgt  

我应用了一些函数,然后,我接受序列号4,5,6,我做了与序列号1,2,3相同的事情,然后我用7,8,9做同样的事情 这是我的功能

def identical(input_string):
code={"a":0,"c":1,"g":2,"t":3}
p=[code[i] for i in input_string]
n=len(input_string)
c=0
for i, n in enumerate(range(n, 0, -1)):
    c +=p[i]*(4**(n-1))
    return c+1

我的功能必须只使用:{“a”,“c”,“g”,“t”},但在fasta文件序列中以'>'开头,如下所示:

>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA
CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG
AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG
CCGCCTCGGGAGCGTCCATGGCGGGTTTGAACCTCTAGCCCGGCGCAGTTTGGGCGCCAAGCCATATGAA
AGCATCACCGGCGAATGGCATTGTCTTCCCCAAAACCCGGAGCGGCGGCGTGCTGTCGCGTGCCCAATGA
ATTTTGATGACTCTCGCAAACGGGAATCTTGGCTCTTTGCATCGGATGGAAGGACGCAGCGAAATGCGAT
AAGTGGTGTGAATTGCAAGATCCCGTGAACCATCGAGTCTTTTGAACGCAAGTTGCGCCCGAGGCCATCA
GGCTAAGGGCACGCCTGCTTGGGCGTCGCGCTTCGTCTCTCTCCTGCCAATGCTTGCCCGGCATACAGCC
AGGCCGGCGTGGTGCGGATGTGAAAGATTGGCCCCTTGTGCCTAGGTGCGGCGGGTCCAAGAGCTGGTGT
TTTGATGGCCCGGAACCCGGCAAGAGGTGGACGGATGCTGGCAGCAGCTGCCGTGCGAATCCCCCATGTT
GTCGTGCTTGTCGGACAGGCAGGAGAACCCTTCCGAACCCCAATGGAGGGCGGTTGACCGCCATTCGGAT
GTGACCCCAGGTCAGGCGGGGGCACCCGCTGAGTTTACGC

>gi|2765657|emb|Z78532.1|CCZ78532 C.californicum 5.8S rRNA gene and ITS1 and ITS2 DNA
CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACAACAGAATATATGATCGAGTG
AATCTGGAGGACCTGTGGTAACTCAGCTCGTCGTGGCACTGCTTTTGTCGTGACCCTGCTTTGTTGTTGG
GCCTCCTCAAGAGCTTTCATGGCAGGTTTGAACTTTAGTACGGTGCAGTTTGCGCCAAGTCATATAAAGC
ATCACTGATGAATGACATTATTGTCAGAAAAAATCAGAGGGGCAGTATGCTACTGAGCATGCCAGTGAAT
TTTTATGACTCTCGCAACGGATATCTTGGCTCTAACATCGATGAAGAACGCAGCTAAATGCGATAAGTGG
TGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCTCGAGGCCATCAGGCTAAG
GGCACGCCTGCCTGGGCGTCGTGTGTTGCGTCTCTCCTACCAATGCTTGCTTGGCATATCGCTAAGCTGG
CATTATACGGATGTGAATGATTGGCCCCTTGTGCCTAGGTGCGGTGGGTCTAAGGATTGTTGCTTTGATG
GGTAGGAATGTGGCACGAGGTGGAGAATGCTAACAGTCATAAGGCTGCTATTTGAATCCCCCATGTTGTT
GTATTTTTTCGAACCTACACAAGAACCTAATTGAACCCCAATGGAGCTAAAATAACCATTGGGCAGTTGA
TTTCCATTCAGATGCGACCCCAGGTCAGGCGGGGCCACCCGCTGAGTTGAGGC

所以,

if line=='>' then  pass

ie:必须忽略像>gi|2765657|emb|Z78532.1|CCZ78532 C.californicum 5.8S rRNA gene and ITS1 and ITS2 DNA这样的行 当我使用我的函数时,它会出现此错误:

KeyError: '>'  

或类似错误:KeyError: 'CGT'

我该怎么做?

4 个答案:

答案 0 :(得分:1)

with open(file, 'r') as f:
    while True:
        line1 = f.readline()
        line2 = f.readline()
        line3 = f.readline()
        if not line3:
            break
        doSomething(line1, line2, line3)

答案 1 :(得分:1)

在python 2.x上:

import itertools
with open('path/to/file') as infile:
    for seq1, seq2, seq3 in itertools.izip(infile, infile, infile):
        do_something(seq1, seq2, seq3)

我使用itertools.izip超过通常zip的原因是因为在python 2.x中,zip返回一个列表,然后迭代。另一方面,itertools.izip迭代相应的元素而不首先创建列表。这节省了内存使用量,以及为内存分配和创建列表所需的时间。

在python 3.x上,内置的zip函数与itertools.izip完全相同,在python 2.x中实现(在python 3.x中获取python 2.x的zip功能,你需要做L = list(zip(…))):

with open('path/to/file') as infile:
    for seq1, seq2, seq3 in zip(infile, infile, infile):
        do_something(seq1, seq2, seq3)

希望这有帮助

答案 2 :(得分:1)

您可以这样做:

import itertools

with open('/tmp/lines.txt', 'rU') as fasta:
    data=itertools.izip_longest(*[fasta]*3)

即使数字行可能不是3的倍数,它也具有传递所有行的优点。最后一个元组的剩余部分(最后一个元组的0,1或2)填充{{1} }。你希望None能够预料到这一点。

或者,如果您想扩展为三个变量:

something()

请注意,由于izip_longest完成元组,如果文件中的行数不是with open('/tmp/lines.txt', 'rU') as fasta: for a,b,c in itertools.izip_longest(*[fasta]*3): something(a,b,c) 的3的整数倍,则可能Nonecb, c 。只是测试一下,如果不完整就扔掉最后一个元组。

如果您知道如果不完整则不使用最后一个元组,请使用:

None

答案 3 :(得分:0)

我认为在python中处理fasta序列的更好方法是使用Biopython。 Ii在开始时可能有点棘手但值得付出努力。

首先你应该安装biopython。只需输入您的终端:

sudo apt-get install python-biopython

现在你在python中有一个令人难以置信的fasta解析器!

>>> from Bio import SeqIO

所以你现在可以迭代记录(序列)并独立检索它们的id,描述,序列,字母,得到反向补码等。

with open("your_fasta_file.fasta", "r") as infh:
    parser = SeqIO.parse(infh, "fasta")

现在您拥有了fasta文件的“解析器”,这是一个可以在循环中使用的迭代器:

for sequence in parser:
    do stuff with sequence.id 
    do stuff with str(sequence.seq) # See below why str(seq)
    do stuff with sequence.description

对于像“> gi | 2765658 | emb | Z78533.1 | CIZ78533 C.irapeanum 5.8S rRNA基因和ITS1和ITS2”这样的记录

sequence.id - >就像“gi | 2765658 | emb | Z78533.1 |”

sequence.description - >将是整个标题“> gi | 2765658 | emb | Z78533.1 | CIZ78533 C.irapeanum 5.8S rRNA基因和ITS1和ITS2”

sequence.seq - >将是序列。你必须要注意这一点,因为sequence.seq返回一个Seq对象:Seq('AGCTAGTAGCTG ... ATGAC',Alphabet())

如果您想将序列作为普通字符串,只需使用:

str(Seq_object)