Hi zusammen,
vorweg, ich bin totaler Anfänger, habe einen Online-Einsteiger-Kurs besucht. Bin also nicht komplett unwissend, aber ich brauche einen Schubser in die richtige Richtung.
Ich möchte eine txt-Datei einlesen (Datenbank-Abzug mit Trennzeichen getrennten Werten) und einen Teil (einige "Spalten") des Inhaltes in eine neue Datei schreiben.
Beispiel:
Input
Name; Vorname; Hobby; Wohort; Alter
Output
Vorname; Hobby; Alter
Datei einlesen via while-Schleife und einfach mal zeilenweise printen geht.
Wie zerlege ich aber die Zeilen anhand des Delimiter (in meinem Fall ";") in Elemente auf die ich dann beim printen (extern schreiben) zugreifen kann.
Was verwendet man hier am besten? Liste? Dictionary? Was ist performant?
Es geht um ca. 500.000 Datensätze mit 50 Spalten; gibts bei dieser Menge überhaupt schon Performanceprobleme, oder ist das lachhaft und wurscht?
Sorry, wenn die ganzen Fragen vielleicht zu banal sind, wie gesagt mit fehlt der Einstieg damitich auf einzelne Spalten zugreifen kann.
Danke Euch,
Jonas
TXT-Datei verarbeiten (CSV-Massendaten)
Die ganz einfache Methode: Strings haben eine Methode split(), die das Trennzeichen als Parameter bekommen kann. Also etwa so, mit den Feldern Deines Beispiels:
Das ist alles andere als optimal - nur dazu da, split und join gezeigt zu haben. Für Deinen Fall würde sich das csv-Modul anbieten (gehört zur Standardbibliothek, ist also in der normalen Python-Dokumentation beschrieben und muss auch nicht extra installiert werden). Das kommt auch mit so was zurecht:
"Hans";"Maier";"Orgel;Kultusbürokratie";"München";99
Hier würde split falsch aufteilen. Und außerdem produziert es wahlweise Listen oder Dictionaries aus den einzelnen Zeilen - für eine gezielte Auswahl bestimmter Felder ist ein Dictionary natürlich bequemer.
Code: Alles auswählen
with open(eingabename, encoding="utf-8") as grunddaten, open(ausgabename, mode="w", encoding="utf-8") as ausschnitt:
for zeile in grunddaten:
alle_felder = zeile.split(";")
manche_felder = [alle_felder[1], alle_felder[2], alle_felder[4]]
ausschnitt.write(";".join(manche_felder) + "\n")
"Hans";"Maier";"Orgel;Kultusbürokratie";"München";99
Hier würde split falsch aufteilen. Und außerdem produziert es wahlweise Listen oder Dictionaries aus den einzelnen Zeilen - für eine gezielte Auswahl bestimmter Felder ist ein Dictionary natürlich bequemer.
-
- User
- Beiträge: 512
- Registriert: Mittwoch 13. November 2019, 08:38
Mein nichtrepräsentativer Test zeigt, dass pandas die schnellste Variante ist:
Die Testdatei hatte ebenfalls 500.000 Zeilen und 50 Spalten. Was die Performance angeht, kommt es natürlich darauf an wie oft du das durchführen musst bzw. wie wichtig die Zeit dabei ist. Für die meisten Anwendungen dürften ca. 5 s noch verschmerzbar sein.
Code: Alles auswählen
import csv
import time
import pandas as pd
import numpy as np
start_time = time.perf_counter()
with open("convertcsv.csv", newline="") as read_file, open("new-csv.csv", "w", newline="") as write_file:
reader = csv.DictReader(read_file, delimiter=";")
writer = csv.writer(write_file, delimiter=";")
writer.writerow(["first", "word", "age"])
for row in reader:
writer.writerow([row["first"], row["word"], row["age"]])
print(f"csv\t{round(time.perf_counter() - start_time, 3)} s")
start_time = time.perf_counter()
df = pd.read_csv("convertcsv.csv", delimiter=";", header=0, usecols=["first", "word", "age"])
df.to_csv("new-pd.csv", index=False, sep=";", header=True)
print(f"pandas\t{round(time.perf_counter() - start_time, 3)} s")
start_time = time.perf_counter()
array = np.loadtxt("convertcsv.csv", dtype=np.object, delimiter=";", usecols=[0, 2, 4])
np.savetxt("new-np.csv", array, delimiter=";", header="first;word;age", encoding="utf-8", fmt="%s")
print(f"numpy\t{round(time.perf_counter() - start_time, 3)} s")
>>>csv 16.759 s
>>>pandas 5.246 s
>>>numpy 12.669 s