2017-07-06 1 views
1

auftreten kann ich diese große Datei mit folgenden Inhalt haben:eine große Datei in kleine Datei basierend auf Muster, das zufällig Python

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

Nun möchte ich diese Datei in kleine Dateien aufgeteilt basierend auf dem Namen in Spalte3. Wie folgt aus:

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 

und ebenfalls. Ich schrieb den folgenden Python-Codes und es funktionierte:

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() 

Nun, meine Frage ist, wie kann ich diese Codes ändern zu arbeiten, selbst wenn column3 nicht sortiert ist. Zum Beispiel:

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

Soll ich erzeugen Zufallsvariable als Wert mit dem Namen in column3 als Schlüssel (in die Ausgabedatei handhaben). Und dann benutzen Sie dieses Wörterbuch, um die Datei jedes Mal zu öffnen, wenn Skript auf den Schlüssel trifft? Jeder Vorschlag wird geschätzt.

+1

Ich würde eine kurze Befehlszeilenlösung für Unix-basierte OS vorschlagen – RomanPerekhrest

Antwort

1

Anstatt Dateizeiger in jeder Zeile zu öffnen und zu schließen, können Sie sie geöffnet lassen, bis Ihre Arbeit erledigt ist.

zuerst ein Wörterbuch für Dateizeiger erstellen:

fps = {} 

Dann in der Schleife der Datendatei Iterieren, wenn der Dateizeiger nicht existiert, erstellen Sie es:

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

dann am Ende der Schleife können Sie die Datei Zeiger schließen:

for f in fps.values(): 
    f.close() 
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

Dies ist ein gutes Beispiel für die groupby() Funktion pandas Datenrahmen:

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) 

Die Schritte sind relativ einfach:

1) Lesen Sie die Datei mit den richtigen Begrenzungszeichen (\s+ steht für eine beliebige Anzahl von Leerzeichen) .

2) eine Schleife durch das Groupy Objekt, das Tupel der Form enthält (common value, dataframe for that value)

2,1) Produzieren eine Datei für jeden Datenrahmen mit dem entsprechenden Namen. (index=False nur besagt, dass wir den Index in den neuen Dateien drucken möchten. Nicht) für jeden Wert von column3 eine neue Datei erstellen können

0

Sie Griff und dann einfach alles in diese Datei schreiben, zum Beispiel:

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() 

Dann können Sie es mit einem einfachen laufen:

split_file("your_file.dat") 

Und es wird auch Dateipfade respektieren, wenn man sie übergeben.

Verwandte Themen