【问题标题】:split the file in many other files using python使用python将文件拆分为许多其他文件
【发布时间】:2012-12-26 05:29:52
【问题描述】:

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

例如:我的文件中的数据是这样的

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

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

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

等等。

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

像第一个文件一样

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

数据。

第二个文件会有

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

数据等等。

【问题讨论】:

  • 您在问题中引用了>(如fasta格式),但该文件没有任何>:它似乎有@
  • 那么什么不起作用?显示您尝试过的内容。

标签: python python-3.x python-2.7


【解决方案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

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

【讨论】:

    【解决方案2】:

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

    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()
    

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

      • 为什么 50 分钟后你的代码和我的一模一样,除了对计数器的一个小调整?我在宣布恶作剧!
      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 2010-10-04
      • 1970-01-01
      • 2016-06-25
      • 2016-05-05
      • 2014-08-24
      • 1970-01-01
      • 2013-08-24
      相关资源
      最近更新 更多