2017-02-28 68 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