2017-07-06 9 views
1

を発生することがありますパターンに基づいて、小さなファイルに大きなファイルを分割しましたcolumn3。は、私は以下の内容で、この大規模なファイルを持ってランダムにPythonの

はFile1:Ramesh.txt

column1 column2 column3 
345  367  Ramesh 
456  469  Ramesh 
300  301  Ramesh 

File2の:Naresh.txt

column1 column2 column3 
298  390  Naresh 

FILE3:Suresh.txt

Column1 column2 column3 
123  125  suresh 
394  305  suresh 

と同様に、このような。 は、私は次のPythonコードを書き、それが働いた:

def split_file(file1): 
source=open(file1) 
l=[] 
header=0 
header_line="" 
file_count=0 
for line in source: 
    line=line.rstrip() 
    a=line.split() 
    if header==0: 
     header_line=line 
     header+=1 
    else: 
     if a[-1] not in l: 
      l.append(a[-1]) 
      file_count+=1 
      if file_count>1: 
       dest.close() 
      else: 
       pass 
      dest=open(a[-1],'a') 
      dest.write(header_line+"\n"+line+"\n") 
     else: 
      dest.write(line+"\n") 
source.close() 
dest.close() 

は今、私のクエリは、私がCOLUMN3がソートされていない場合でも動作するようにこれらのコードを変更する方法です。例:

Column1 column2 column3 
345  367 Ramesh 
123  125 Suresh 
456  469 Ramesh 
298  390 Naresh 
300  301 Ramesh 
394  305 Suresh 

出力ファイルを処理するための値としてランダム変数をキーとして、column3に名前を付けて生成しますか?スクリプトがキーに出会うたびにこの辞書を使用してファイルを開きますか?どんな提案も感謝します。

+1

私は、UnixベースのOS用の短いコマンドラインソリューションを提案します – RomanPerekhrest

答えて

1

すべての行でファイルポインタを開いて閉じるのではなく、作業が完了するまで開いたままにしておくことができます。

まずファイルポインタ用の辞書を作成します。

fps = {} 

その後、あなたのデータファイルを反復ループで、ファイルポインタが存在し、それを作成していない場合:

if a[-1] not in fps.keys(): 
    fps[a[-1]] = open(a[-1], 'a') 
fps[a[-1]].write(line) 

その後でループの最後で、ファイルポインタを閉じることができます:

1
def split_file(filename): 
    dest = {} 
    with open(filename) as source: 
     header_line = next(source) 
     for line in source: 
      name = line.rstrip().split()[-1] 
      if name not in dest: 
       dest[name] = open(name + '.txt', 'w') 
       dest[name].write(header_line) 
      dest[name].write(line) 
    for d in dest.values(): 
     d.close() 
1

これはパンダのデータフレームのgroupby()関数の典型的な例である:

import pandas as pd 

data = pd.read_csv('dat.csv', delimiter="\s+") 
for val, df in data.groupby(['column3']): 
    df.to_csv(val + ".csv", sep='\t', index=False) 

手順は比較的単純である:

1)正しい区切り文字(空白の任意の数の\s+スタンド)を使用してファイルを読みます。

2)形態(common value, dataframe for that value)

2.1)に対応する名前を持つ各データフレームのためのファイルを生成するタプルが含まgroupyオブジェクトを介してループ。 (index=Falseはちょうど私たちは新しいファイルにインデックスを印刷しないと述べている。)

0

あなたはcolumn3の値ごとに新しいファイルハンドルを作成してからちょうど例えば、そのファイルにすべてを書くことができます:

import os 

def split_file(path): 
    file_handles = {} # a map of file handles based on the last param 
    target_path = os.path.dirname(path) # get the location of the passed file path 
    with open(path, "r") as f: # open our input file for reading 
     header = next(f) # reads the first line to use as a header in all files 
     for line in f: 
      index = line.rfind(" ") # replace with \t if you use tab-delimited files 
      value = line[index+1:].rstrip() # get the last value 
      if not value: # invalid entry, skip 
       continue 
      if value not in file_handles: # we haven't started writing to this file 
       # create a new file with the value of the last column 
       handle = open(os.path.join(target_path, value + ".txt"), "a") 
       handle.write(header) # write the header to our new file 
       file_handles[value] = handle # store it to our file handles list 
      else: 
       handle = file_handles[value] 
      handle.write(line) # write the current line to the designated handle 
    for handle in file_handles.values(): # close our output file handles 
     handle.close() 

その後、あなたはシンプルでそれを実行することもできます。

split_file("your_file.dat") 

をそして、あなたはそれらを渡した場合、それもファイルパスを尊重します。

関連する問題