帮助我,
我有一个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'
我该怎么做?
答案 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的整数倍,则可能None
或c
为b, 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)