如何在python中指定每行中的字符数?

时间:2015-07-31 05:01:04

标签: python

我有fasta文件,其中包含两个基因序列,我想要删除的是fasta标题(以">"开头的行),连接其余的行并输出该序列每行50个字符的长度。我取得了一些进展但最终受到了打击。

这是我的fasta序列:

>Potrs164783
AGGAAGTGTGAGATTGAAAAAACATTACTATTGAGGAATTTTTGACCAGATCAGAATTGAACCAACATGATGAAGGGGAT
TGTTTGCCATCAGAATATGGCATGAAATTTCTCCCCTAGATCGGTTCAAGCTCCTGTAGGTTTGGAGTCCTTAGTGAGAA
CTTTCTTAAGAGAATCTAATCTGGTCTGTTCCTCGTCATAAGTTAAAGAAAAACTTGAAACAAATAACAAGCATGCATAA
>Potrs164784
TTACCCTCTACCAGCACCAATGCCTATGATCTTACAAAAATCCTTAATAAAAAGAAATCCAAAACCATTGTTACCATTCC
GGAATTACATTCTGAGATAAAAACCCTCAAATCTGAATTACAATCCCTTAAACAAGCCCAACAAAAAGACTCTGCCATAC

我想要的输出是这样的

>conc
AGGAAGTGTGAGATTGAAAAAACATTACTATTGAGGAATTTTTGACCAGA
TCAGAATTGAACCAACATGATGAAGGGGATTGTTTGCCATCAGAATATGG
CATGAAATTTCTCCCCTAGATCGGTTCAAGCTCCTGTAGGTTTGGAGTCC
TTAGTGAGAACTTTCTTAAGAGAATCTAATCTGGTCTGTTCCTCGTCATA
AGTTAAAGAAAAACTTGAAACAAATAACAAGCATGCATAAACCATATGGC
ATTTTGCATCCATTTGTGCATTTCATTTAGTTTACTTGCATTCATTCAGG

到目前为止,我的脚本是

final = list()

with open("test.fa", 'r') as fh_in:
    for line in fh_in:
        line = line.strip()
        if not line.startswith(">"):
            final.append(line)

final2 = "".join(final)

with open("testconcat.fa", 'w') as fh_out:
    fh_out.write(">con")
    fh_out.write("\n")
    fh_out.write(final2)

我怎样才能确保每行只写50个字符?

2 个答案:

答案 0 :(得分:3)

您可以使用内置的textwrap

import textwrap
final2 = "".join(final)
print '\n'.join(textwrap.wrap(final2, 50)

答案 1 :(得分:1)

当处理大文件时,如果你在内存中进行连接,切片等,你可能会遇到奇怪的问题,因为你会为appending每行消耗相对更多的内存然后在实际写入文件之前,splitting再次将它们分成等分的块。

我认为避免此类问题的最佳方法是在文件上运行而不是在内存上运行,换句话说,您应该在阅读的同时进行编写。

>>> with open('test.fa', 'r') as r, open('testconcat.fa', 'w') as w:
...     for line in r:
...         if not line.startswith(">"):
...             w.write(line.strip())

>>> with open('testconcat.fa', 'r+') as w:
...     chunk = 50
...     i = 0
...     while next(w, None):
...         w.seek(((i + 1) * chunk) + i)
...         w.write('\n')
...         i = i + 1

>>> cat testconcat.fa
AGGAAGTGTGAGATTGAAAAAACATTACTATTGAGGAATTTTTGACCAGA 
CAGAATTGAACCAACATGATGAAGGGGATTGTTTGCCATCAGAATATGGC
TGAAATTTCTCCCCTAGATCGGTTCAAGCTCCTGTAGGTTTGGAGTCCTT
GTGAGAACTTTCTTAAGAGAATCTAATCTGGTCTGTTCCTCGTCATAAGT
AAAGAAAAACTTGAAACAAATAACAAGCATGCATAATTACCCTCTACCAG
ACCAATGCCTATGATCTTACAAAAATCCTTAATAAAAAGAAATCCAAAAC
ATTGTTACCATTCCGGAATTACATTCTGAGATAAAAACCCTCAAATCTGA
TTACAATCCCTTAAACAAGCCCAACAAAAAGACTCTGCCATAC

希望这有帮助。