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

最初のチャンクが第二のチャンクからのライン数で強く異なります

あなたはチャンクこのファイルをしてみたいと思います。この例の出力は、chunk1.txtあろう

(7つのライン対3行):

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

これは、各チャンクでファイルを1つのファイルに分割するのには問題ありません。実際には私は安全に1つのファイルに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

関連する問題