Dateien auslesen & erstellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Freumel
User
Beiträge: 69
Registriert: Donnerstag 25. Januar 2018, 13:47

Hallöchen,
ich versuche .csv Dateien auszuwerten und weiter zu verarbeiten.

Dazu ziehe ich per Drag & Drop die entsprechende Datei in die Konsole und lese sie aus:

Code: Alles auswählen

pfad=input(">>")
zeile=[]
zelle=[]
file=open(pfad,"r")
for line in file:
	zeile.append(line)
for i in range(len(zeile)):
	zelle.append(zeile[i].split(";"))		#zelle[zeile][spalte]
file.close()
Nun möchte ich einige Werte in eine neue Datei schreiben:

Code: Alles auswählen

for i in range(0,len(zeile):
	pfad=pfad.replace("CSV-Datei.csv","")
	path=os.path.join(pfad,Verzeichnis,zelle[i][0])
	file=open(path,"w")
	#[...]
	file.close()
Mein Code funktioniert nicht immer. Daher frage ich an dieser Stelle nach schlechten Angewohnheiten und Optimierung.
Benutzeravatar
__blackjack__
User
Beiträge: 14135
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Freumel: Was heisst „funktioniert nicht immer“ denn genau? Um Fehler zu beheben, muss man ja erst einmal wissen was der/die Fehler ist/sind.

Der Name `zeile` wäre für einen Wert passend der *eine* Zeile repräsentiert, nicht für eine Liste mit Zeilen. Gleiches gilt für `zelle`.

``for i in range(len(sequence)):`` ist in Python ein „anti-pattern“. Man kann direkt über die Elemente von Sequenztypen iterieren, ohne den Umweg über einen Index. Falls man *zusätzlich* einen fortlaufenden Zahlwert benötigt, gibt es die `enumerate()`-Funktion.

Im ersten Beispiel könnte man die Datei früher schliessen; nach dem Einlesen der Zeilen in die Liste. Das ginge auch ohne ``for``-Schleife: ``zeilen = list(file)``. Und bei `zellen` könnte man statt der ``for``-Schleife eine „list comprehension“ verwenden: ``zellen = [zeile.split(';') for zeile in zeilen]``.

Bei Dateien bietet sich die ``with``-Anweisung an um sie sicher wieder zu schliessen, auch wenn beispielsweise eine Ausnahme auftritt während man liest oder schreibt.

Im zweiten Beispiel fehlt eine schliessende Klammer, das kann so also nie gelaufen sein, weil es nicht einmal am Compiler vorbei kommt.

Das Ersetzen einer Zeichenkette im gesamten Pfad als Zeichenkettenoperation, und wie es aussieht auch noch um das letzte Pfadelement (den Dateinamen) zu entfernen ist falsch. Hier ist wohl eher die `os.path.dirname()`-Funktion gefragt.

Englisch und Deutsch zu mischen ist schon keine gute Idee, weil man sich dann gerne mal fragt ob man eine Variable nun `pfad` oder `path` genannt hat. Dann auch noch tatsächlich `pfad` und `path` als Namen zu verwenden erweitert das um die Frage was denn nun eigentlich was beschreibt.

Warum werden die Daten in zwei verschiedenen Formaten im Speicher gehalten? Also Zeilen und ”Zellen”?

Um das Gleichheitszeichen bei Zuweisungen ausserhalb von Argumentlisten, und nach Kommata, gehören Leerzeichen. Dann ”klebt” das nicht so aneinander und ist leichter lesbar.

Edit:

Code: Alles auswählen

    result_folder = 'ergebnisse'
    path = input('>>')
    with open(path, 'r') as in_file:
        lines = list(in_file)
    rows = [line.split(';') for line in lines]    

    for row in rows:
        path = os.path.join(os.path.dirname(path), result_folder, row[0])
        with open(path, 'w') as out_file:
            # …
            pass
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@Freumel: wenn es sich um csv-Dateien handelt, nimm das csv-Modul zum Lesen:

Code: Alles auswählen

import csv
with open(path) as lines:
    rows = list(csv.reader(lines, delimiter=';'))
Antworten