2

我有一个文件,我想将其拆分为许多其他部分。我想使用python代码...

eg:我文件中的数据是这样的

>2165320 21411 200802 8894-,...,765644-
TTCGGAGCTTACTAATTTTAAATATGAAGAATGCCAATATAAGTTTTGATTTCGAAAATACTTTTTTACTAGTTAAAAATTCATGATTTTCTACATCTATAACAATTTGTGTTTTTTTTAAACATCTTCCAGTGTCCTAAGTGTATATTTTTTAACGCAATGTTTGAATACTTTTAGGGTTTACCTTATTTAATTTGATTTTTAATGTGAGTTGTAATCACTGGTGAGCATACTGTTTTTCTTTTGTTCAGTAATATTGCATTTGTAGCTTTTGTATTGCTTAGATATATCACATTAAATCCTTTGTTCAGAAACCCATCCGACAGGGAGTCATAGGTGCCACACTAGTGGTCGAGGATCTAGGATGTCGGAAGGTCAACAATGGGGTAAAACACTAATTTTTTAATTTCTTGTATTTACCAAATTTACTGATTTTGCATTTAGTAGATGGTATATATACTCTTCTACCTTGTACAGTTGATGGTACCTGACTAAATATGTTTTATTTCCTTCTCCAGGATCTTTATGTAGTACGATTCTACAGTCGTCAAGAGGAGGGTAGAAAAGGAGAAGTAAGTTATAATATTTCTGAGCTTTTTTCTTTTTAATTGTTGTTGATAGAAAGTTGTGCCATATACATGTTTTAAGGTGGTGTA

>2165799 14641 135356 16580+,...,680341-
AAGGTAGGAGGTACTCGTGCTAATGGAGGAGCTAATGGTACACCAAACCGACGGCTGTCACTTAATGCTCATCAAAACGGAAGCAGGTCCACAACAAAAGATGGAAAAAAAGACATCAGACCAGTTGCTCCTGTGAATTATGTGGCCATATCAAAAGAAGATGCTGCTTCCCATGTTTCTGGTACCGAACCAATCCCGGCATCACCCTAATAATGAGATCTTCATTATCAACCCTACAATTTCATCTTTGTAGCATGATCAAATACTAGTTACTGCTTTAGGAATTATAATATGGAGTGACAAGTAATTAGAGAGGAACTGTTTTGAGCTGTGTATGTTCAATTTGCCATTTGGAGGTTTTCTCAATACATGTGCCCTTTAATATGAAAATATAGTGCTATTCTTGCCTTTCTCCAAACCCTGGCTCCTCCTATTCATCGGTTTCTT

>2169677 23891 1928391 1298391,…..,739483-
CTAGCTGATCGAGCTGATCGTAGTGAGCTATCGAGCTGACTACTAGCTAGTCGTGATAGCTGATCGAGCTGACTGATGTGCTAGTAGTAGTTTCATGATTTTCTACATCTATAACAATTTGTGTTTTTTTTAAACATCTTCCAGTGTCCTAAGTGTATATTTTTTAACGCAATGTTTGAATACTTTTAGGGTTTACCTTATTTAATTTGATTTTTAATGTGAGTTGTAATCACTGGTGAGCATACTGTTTTTCTTTTGTTCAGTAATATTGCATTTGTAGCTTTTGTATTGCTTAGATATATCACATTAAATCCTTTGTTCAGAAACCCATCCGACAGGGAGTCATAGGTGCCACACTAGTGGTCGAGGATCTAGGATGTCGGAAGGTCAACAATGGGGTAAAACACTAATTTTTTAATTTCTTGTATTTACCAAATTTACTGATTTTGCATTTAGTAGATGGTATATATACTCTTCTACCTTGTACAGTTGATGGTACCTGACTAAATATGTTTTATTTCCTTCTCCAGGATCTTTATGTAGTACGATTCTACAGTCGTCAAGAGGAGGGTAGAAAAGGAGAAGTAAGTTATAATATTTCTGAGCTTTTTTCTTTTTAATTGTTGTTGATAGAAAGTTGTGCCATATACATGTTTTA

等等。

所以现在我想将文件从 '>' sing 拆分为下一个文件,并将其存储在一个单独的文件中。

像第一个文件一样

>2165320 21411 200802 8894-,...,765644-
TTCG…..GTA    

数据。

第二个文件将有

>2165799 14641 135356 16580+,...,680341-
AAGG….GTTTCTT     

数据等。

4

3 回答 3

1

看来您的数据只是换行符分隔,因此您需要做的就是遍历行并将非空白行写入递增文件:

with open("source.txt") as f:
    counter = 1
    for line in f:
        if not line.strip():
            continue
        with open("out_%03d.txt" % counter, 'w') as out:
            out.write(line)
        counter += 1

这将假设每个组实际上都是一条长线(我不清楚真正的格式)。

因为你没有给我们太多关于这个文件的真实格式的解释,这里有另一个选项,以防它们真的是应该在同一个文件中的行之间的换行符。如果“@”是一个新组的可靠指示符,我们可以用它来表示一个新文件:

with open("source.txt") as f:
    counter = 1
    out = None 

    for line in f:
        if line.lstrip().startswith("@"):
            if out is not None:
                out.close()
            out_name = "out_%03d.txt" % counter
            counter += 1
            out = open(out_name, 'w')

        out.write(line)

    if out is not None:
        out.close()
于 2012-12-26T05:36:23.970 回答
1

要将每个空行分隔的行组写入单独的文件,您可以使用itertools.groupby()

#!/usr/bin/env python
import sys
from itertools import groupby

def blank(line, mark=[0]):
    if not line.strip(): # blank line
       mark[0] ^= 1 # mark the start of new group
    return mark[0]

for i, (_, group) in enumerate(groupby(sys.stdin, blank), start=1):
    with open("group-%03d.txt" % (i,), "w") as outfile:
        outfile.writelines(group)

用法:

$ python split-on-blank.py < input_file.txt

如果您经常使用此类格式;考虑使用适当的解析器,例如Bio.SeqIO.parse()由 biopython 提供的函数。

于 2012-12-26T06:31:03.533 回答
0
with open("source.txt") as f:        
     counter = 1
     for line in f:
        if counter % 3 == 0:
            continue
        with open("out_%03d.txt" % counter, 'w') as out:
            out.write(line)
        counter += 1
于 2012-12-26T06:24:03.133 回答