Split große csv-Datei, indem Sie den Wert einer Spalte in python
Ich habe eine csv-große Datei, die ich nicht behandeln kann in Speicher mit python. Ich bin Aufspaltung es in mehrere Stücke nach der Gruppierung nach dem Wert einer bestimmten Spalte mit der folgenden Logik:
def splitDataFile(self, data_file):
self.list_of_chunk_names = []
csv_reader = csv.reader(open(data_file, "rb"), delimiter="|")
columns = csv_reader.next()
for key,rows in groupby(csv_reader, lambda row: (row[1])):
file_name = "data_chunk"+str(key)+".csv"
self.list_of_chunk_names.append(file_name)
with open(file_name, "w") as output:
output.write("|".join(columns)+"\n")
for row in rows:
output.write("|".join(row)+"\n")
print "message: list of chunks ", self.list_of_chunk_names
return
Die Logik ist, aber es ist langsam. Ich Frage mich, wie kann ich diese optimieren? Zum Beispiel mit pandas?
Bearbeiten
Weiteren Erklärung: ich bin nicht auf der Suche nach einer einfachen Aufteilung auf gleiche Größe Brocken (wie jeder mit 1000 Zeilen), die ich teilen möchten, indem Sie den Wert einer Spalte, das ist, warum ich bin mit groupby.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie diese Python 3 Programm:
Speichern Sie es als
split-csv.py
und führen Sie es aus dem Explorer oder aus dem BefehlLinie.
Zum Beispiel nach split
superuser.csv
basierend auf Spalte 1 und schreiben Sie dieoutput-Dateien unter
dstdir
verwenden:Wenn man es ohne Argumente, ein Tkinter basierende GUI werden Sie aufgefordert,
wählen Sie die input-Datei, die Spalte (1-basierte index) und die
Ziel-Verzeichnis.
ref
Werde ich mit sowas wie dem folgenden, wo ich bin der Iteration über die eindeutigen Werte der Spalte aufteilen, indem Sie, Sie zum filtern von Daten-chunks.
Ich vermuten, dass Ihr größter Engpass ist das öffnen und schließen einer Datei-handle jedes mal, wenn ein neuer block von Zeilen. Einen besseren Ansatz, solange die Anzahl der Dateien, die Sie schreiben, ist nicht zu groß, ist zu halten, alle Dateien öffnen. Hier ist ein überblick:
Natürlich, wenn man nur eine Gruppe mit einer beliebigen Taste, wird das nicht helfen. (Tatsächlich, es kann alles noch schlimmer machen, weil Sie wind-up-holding eine Reihe von Dateien zu öffnen unnötig.) Je mehr du in den wind schreiben, um eine einzelne Datei, desto mehr profitieren Sie bekommen von dieser änderung.
Kombinieren Sie diese mit den pandas, wenn Sie wollen, und das chunking-Funktionen
read_csv
oderread_table
Griff der input-Verarbeitung.Dann werden Sie wahrscheinlich die beste Leistung über den eingebauten chunking Funktionen der pandas (die
chunksize
keyword arg zuread_csv
),http://pandas.pydata.org/pandas-docs/version/0.16.2/generated/pandas.read_csv.html
Beispielsweise
EDIT:
Diesem vielleicht bekommen Sie irgendwo,