2017-06-15 10 views
0

私の問題は、大きなテキストファイル(少なくともいくつかのGBs)を読んでから、読んでいる間、パターンに応じて、多くの出力テキストファイル(約5000)にその一部を書き込むということです。このパターンまたはそのパターンが存在する場合は、このファイルまたはそのファイルに書き込む必要があります。Pythonは、多数のファイルを開いた後、どのように呼び出すことができますか?

私は5000のテキストファイルをすべて事前に作成できますが、後でその特定のテキストファイルにアクセスする方法はわかりません。効率も大きな問題ですが、私はそこにいません。

さらに明確にする:5000パターンありますが、それらの数は数億、おそらくそれ以上です。だから私は特定のパターンにつまずくときは、私はテキストファイルに書きます。しかし、順序がないので、私はそれを参照するたびに、同じ出力ファイルを1million行後に、たとえば3行後に呼び出す必要があるかもしれません。

ありがとうございます(私もPython言語の初心者ですを使用する)

+0

あなたはデータがそれの内側に置くようになったとして、なぜファイルを作成していませんか? –

+0

これは非常に不明瞭な問題です。どのファイルにどのように書き込むかをどのように決定するのですか? –

+0

私は今それをより明確にするために編集中です – xcvbnm

答えて

3

open()ビルトインPythonでファイルを開くためのものです。

大文字の場合はmode = r、他のすべてのファイルの場合はmode = aを使用します。 Pythonはファイルがまだ存在しない場合は作成しますので、事前に作成する必要はありません。

大きなファイルを読み込んでいるときに、書き込みたいファイルへのパスを文字列として指定するだけで、文字列の書式設定を使用できます。

with open(r"/BigFile.txt",mode=r) as InputFile: 
    for row in InputFile: 

     id = #what you want to have to determine which file to write to 

     file_to_write_to = r"/Subfiles/outputfile{}.txt".format(id) 

     with open(file_to_write_to,mode="a") as OutputFile: 
      OutputFile.write(row + "\n") 

with open()構文の利点は、ファイルオブジェクトに.close()関数を呼び出す必要がないということです)

このコードは、入力に1つのファイルのオープンとクローズ操作があるという欠点を持っていますブロック。バッチとしてそれらをエクスポートする前にいくつかの出力操作のリストを作成することを検討したいかもしれませんが、それは同じファイルに複数の出力操作がある場合にのみ時間上の利点を与えます。

BATCH_SIZE = 500 
batch_dict = {} 

with open(r"/BigFile.txt",mode=r) as InputFile: 
    for index,row in enumerate(InputFile): 

     id = #what you want to have to determine which file to write to 
     if batch_dict.setdefault(str(id),row) is not None: 
      batch_dict[str(id)] = batch_dict[str(id)] + row +"\n" 

     if index % BATCH_SIZE = 0: 
      for batch_id,batch in batch_dict: 

       file_to_write_to = r"/Subfiles/outputfile{}.txt".format(id) 
       with open(file_to_write_to,mode="a") as OutputFile: 
        OutputFile.write(batch + "\n") 

      batch_dict = {} 

(私は今のpython 3を持っていけないようなコードがテストされていない)

+0

ありがとう、これは間違いなく私が必要なものです。私はあなたの時間がかかりません場合、私はバッチを構築する方法についてコメントをすることができます。私はそうでなければ検索することができます。もう一度ありがとう – xcvbnm

+1

@xcvbnm私は私の答えを編集しました。私はBATCH_SIZEの良い値がどれくらいのものか、実際に時間の利点がどれくらいあるか分かりません。 –

0

ファイルを開くときは、追加モードでのみ必要です。データを書き込んだ後に閉じてください。

with open('my-file-name','a+') as ff: 
    ff.write('my-text'+'\n') 
+0

私はそれをより明確にするために編集しました、それを見てみることができます – xcvbnm

関連する問題