2015-08-16 44 views
0

我有一個包含多個序列的fasta文件,我想要做的就是在每個序列的末尾添加64個N。如何在python文件末尾添加一堆「N」?

這裏是

>164778 
AATCTAGATTTGTGTTGAACAACCCTTGGTACAACAAATACTTGGCACTTTTATAACCCAACTGTATGGTATAATCGACA 
TCTGTGTTATGAAAGGAACTTGATTTGTTGTTAACATAAGCAATCACCATGAATACCTGATAATATTTACAAGTATTGGC 
ATTACTCGAATAAGATAATTAATGTAATCATGTTAACAATTTATAATCTAATTGAAACCTCCTTTGTGTGTGGTTTCCAA 
TTGGGCAATAAGAGTTTATAC 
>164779 
AAATCACTTTCAGTGGAAAATTATAAAACCTATTAATTTATTGCCGGCCCTCAAATCAACGCAACCCAAAACCTATTAAT 
TATAAAACCTATTAATTTATTTTTTCAATCAACTACGACTATTAATTATATTTGATGATAATGAATGAAATGACACCATG 
GTTATATAAAAAATATGTCAAAAGCTATTCTTAATAGGGTTT 

我想獲得這一點

>chr 
AATCTAGATTTGTGTTGAACAACCCTTGGTACAACAAATACTTGGCACTTTTATAACCCAACTGTATGGTATAATCGACA 
TCTGTGTTATGAAAGGAACTTGATTTGTTGTTAACATAAGCAATCACCATGAATACCTGATAATATTTACAAGTATTGGC 
ATTACTCGAATAAGATAATTAATGTAATCATGTTAACAATTTATAATCTAATTGAAACCTCCTTTGTGTGTGGTTTCCAA 
TTGGGCAATAAGAGTTTATACNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAATCACTTTCAGTGGAAAATTATAAAACCTATTAATTTATTGCCGGCCCTCAAATCAACGCAACCCAAAACCTATTAATTATAAAACCTATTAATTTATTTTTTCAATCAACTACGACTATTAATTATATTTGATGATAATGAATGAAATGACACCATG 
GTTATATAAAAAATATGTCAAAAGCTATTCTTAATAGGGTTT 

的代碼,我現在的問題是將N-的在每一行的末尾輸入文件的例子,不在每個序列的末尾。

import textwrap 

result = list() 
spacer = "N" * 64 

with open ("join_fasta_test.fasta", 'r') as fh_in: 
    for line in fh_in: 
     line = line.strip() 
     if not line.startswith(">"): 
      result.append(line) 
      result.append(spacer) 

print result 
result2 = "".join(result) 
print result2 
result3 = '\n'.join(textwrap.wrap(result2, 80)) 
print result3 

with open("join_fasta_test_out.fasta", 'w') as fh_out: 
    fh_out.write(">chr") 
    fh_out.write("\n") 
    fh_out.write(result3) 
+1

什麼方式隔開序列?如何判斷一個序列何時*超過*。 – wwii

+0

您的描述和示例輸出不完全匹配。我希望你的輸出也包含所有的'> {number}'行,然後是僅添加了間隔符的序列。 –

回答

2

只是寫一行直到你可以測試下一個;這樣你可以讀取該文件,並一氣呵成寫出來,沒有必要保持整個事情的記憶:

spacer = "N" * 64 

with open ("join_fasta_test.fasta", 'r') as fh_in, \ 
     open("join_fasta_test_out.fasta", 'w') as fh_out: 
    prev = next(fh_in) # first line 
    for line in fh_in: 
     if line.startswith('>'): 
      prev = prev.rstrip('\n') + spacer + '\n' 
     fh_out.write(prev) 
     prev = line 
    fh_out.write(prev.rstrip('\n') + spacer + '\n') 

所以prev是在任何時候都前行,而且只檢查後寫的「當前'行,如果當前行以>開頭,則在間隔符上添加。

演示:

>>> from cStringIO import StringIO 
>>> sample = '''\ 
... >164778 
... AATCTAGATTTGTGTTGAACAACCCTTGGTACAACAAATACTTGGCACTTTTATAACCCAACTGTATGGTATAATCGACA 
... TCTGTGTTATGAAAGGAACTTGATTTGTTGTTAACATAAGCAATCACCATGAATACCTGATAATATTTACAAGTATTGGC 
... ATTACTCGAATAAGATAATTAATGTAATCATGTTAACAATTTATAATCTAATTGAAACCTCCTTTGTGTGTGGTTTCCAA 
... TTGGGCAATAAGAGTTTATAC 
... >164779 
... AAATCACTTTCAGTGGAAAATTATAAAACCTATTAATTTATTGCCGGCCCTCAAATCAACGCAACCCAAAACCTATTAAT 
... TATAAAACCTATTAATTTATTTTTTCAATCAACTACGACTATTAATTATATTTGATGATAATGAATGAAATGACACCATG 
... GTTATATAAAAAATATGTCAAAAGCTATTCTTAATAGGGTTT 
... ''' 
>>> spacer = "N" * 64 
>>> fh_in = iter(sample.splitlines(True)) 
>>> fh_out = StringIO() 
>>> prev = next(fh_in) # first line 
>>> for line in fh_in: 
... if line.startswith('>'): 
...  prev = prev.rstrip('\n') + spacer + '\n' 
... fh_out.write(prev) 
... prev = line 
... 
>>> fh_out.write(prev.rstrip('\n') + spacer + '\n') 
>>> print fh_out.getvalue() 
>164778 
AATCTAGATTTGTGTTGAACAACCCTTGGTACAACAAATACTTGGCACTTTTATAACCCAACTGTATGGTATAATCGACA 
TCTGTGTTATGAAAGGAACTTGATTTGTTGTTAACATAAGCAATCACCATGAATACCTGATAATATTTACAAGTATTGGC 
ATTACTCGAATAAGATAATTAATGTAATCATGTTAACAATTTATAATCTAATTGAAACCTCCTTTGTGTGTGGTTTCCAA 
TTGGGCAATAAGAGTTTATACNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
>164779 
AAATCACTTTCAGTGGAAAATTATAAAACCTATTAATTTATTGCCGGCCCTCAAATCAACGCAACCCAAAACCTATTAAT 
TATAAAACCTATTAATTTATTTTTTCAATCAACTACGACTATTAATTATATTTGATGATAATGAATGAAATGACACCATG 
GTTATATAAAAAATATGTCAAAAGCTATTCTTAATAGGGTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
+0

它的工作,但不是我想要的方式。我可以修改這個以適應我的需求。一個問題,但。你爲什麼要寫兩次輸出文件? – upendra

+0

@upendra:在輸入文件完成時,'prev'中還有一行仍然需要寫出。 –

+0

謝謝。我現在明白了.. – upendra