2017-02-28 72 views
1

我需要将大型文本文件拆分为更小的块,从而使文本文件包含需要保持在一起的数据。每个数据相关的块是从下一个用换行分隔,就像这样:在空行的X行之后拆分文件

Some Data belonnging to chunk 1 
Some Data belonnging to chunk 1 
Some Data belonnging to chunk 1 

More Data, belonnging to chunk 2 
More Data, belonnging to chunk 2 
More Data, belonnging to chunk 2 

我怎么能确定若干行之后,下一个空行,以保持数据块,文件被分割?我想为此使用Python,但我不知道如何在 X行之后使用分割函数

+0

使用计数器和模数。 –

+0

这可能对您有所帮助http://stackoverflow.com/a/544932/568901 – sangheestyle

回答

1

如果你想写新chunk1.txt ... chunkN.txt对于每个大块,你可以这样做的方式:

def chunk_file(name, lines_per_chunk, chunks_per_file): 

    def write_chunk(chunk_no, chunk): 
     with open("chunk{}.txt".format(chunk_no), "w") as outfile: 
      outfile.write("".join(i for i in chunk)) 

    count, chunk_no, chunk_count, chunk = 1, 1, 0, [] 
    with open(name, "r") as f: 
     for row in f: 
      if count > lines_per_chunk and row == "\n": 
       chunk_count += 1 
       count = 1 
       chunk.append("\n") 
       if chunk_count == chunks_per_file: 
        write_chunk(chunk_no, chunk) 
        chunk = [] 
        chunk_count = 0 
        chunk_no += 1 
      else: 
       count += 1 
       chunk.append(row) 
    if chunk: 
     write_chunk(chunk_no, chunk) 

chunk_file("test.txt", 3, 1) 

您必须指定线,属于大块,之后预计换行。

说要大块这个文件:

Some Data belonnging to chunk 1 

Some Data belonnging to chunk 1 
Some Data belonnging to chunk 1 
Some Data belonnging to chunk 1 
Some Data belonnging to chunk 1 
Some Data belonnging to chunk 1 

More Data, belonnging to chunk 2 
More Data, belonnging to chunk 2 
More Data, belonnging to chunk 2 

第一小盘强烈行数从第二块不同。 (7行比3行)

这个例子的输出将是chunk1.txt

Some Data belonnging to chunk 1 

Some Data belonnging to chunk 1 
Some Data belonnging to chunk 1 
Some Data belonnging to chunk 1 
Some Data belonnging to chunk 1 
Some Data belonnging to chunk 1 

而且chunk2.txt

More Data, belonnging to chunk 2 
More Data, belonnging to chunk 2 
More Data, belonnging to chunk 2 

这种方法假定lines_per_chunk是最小块大小,因此即使块的行数不同也可以工作。当达到最小块大小时,我们只寻找空白行来结束块。 在上面的例子中,没有问题,第2行有一个空行,因为尚未达到最小块大小。如果第4行出现空行,并且块数据之后继续存在,则会出现问题,因为指定的标准(行号和空行)无法单独标识块。

+0

这对于大文件(> 100万行)和行数差异很大(从8行到70行)可能不起作用,对吗? – kbecker87

+0

@ kbecker87我刚刚修改了解决方案,只准备了在100万行文件上进行评估和测试脚本时的行。大块需要8秒。如果块大小差异很大,它也可以工作。在你的例子中,你必须将最小尺寸设置为8行来识别第一个块。如果在具有70行的块中,在前8行之后没有空行,它将起作用。否则,你需要另一个标准来识别块。 – Tristan

+0

这适用于在每个块中将文件分割为单个文件。其实我需要安全地说1000个大块放入一个文件,下一个1000放入下一个文件等等。 – kbecker87

2
from itertools import groupby 

with open(myfile, 'r') as f: 
    chunks = [[x.strip() for x in v] for k, v in 
       groupby(f, lambda x: x.strip()) if k] 
+1

删除'f.readlines()'以让文件行上的迭代器工作。不要一次读取整个文件。否则好的解决方案 –

+0

感谢您的提示。我不知道你可以像这样迭代文件。 – Ohjeah