2

他の多くの部分に分割したいファイルがあります。Pythonコードを使いたい...

例:ファイル内のデータは次のようになります

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

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

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

等々。

だから今、ファイルを「>」から次のファイルに分割して、これを別のファイルに保存したいと思います。

最初のファイルのように

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

データ。

2番目のファイルには

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

データなど。

4

3 に答える 3

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 に答える
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

これは、各グループが実際には 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 に答える
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 に答える