Seite 1 von 1

TXT-Datei verarbeiten (CSV-Massendaten)

Verfasst: Mittwoch 27. Januar 2021, 13:12
von Flunz
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

Re: TXT-Datei verarbeiten (CSV-Massendaten)

Verfasst: Mittwoch 27. Januar 2021, 20:38
von bb1898
Die ganz einfache Methode: Strings haben eine Methode split(), die das Trennzeichen als Parameter bekommen kann. Also etwa so, mit den Feldern Deines Beispiels:

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")
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.

Re: TXT-Datei verarbeiten (CSV-Massendaten)

Verfasst: Donnerstag 28. Januar 2021, 10:06
von einfachTobi
Mein nichtrepräsentativer Test zeigt, dass pandas die schnellste Variante ist:

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
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.