CSV-Datei wird nicht komplett beschrieben

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
powaaah
User
Beiträge: 19
Registriert: Samstag 24. Oktober 2015, 12:42

Hallo,

ich schreibe mir ein Englisch programm, welches mich die Wörter von (Sprachniveau) A1 bis B1 abfragen kann. Dazu habe ich eine CSV-Datei mit 6 Spalten und 4075 Zeilen erstellt (vokabeln). Diese möchte ich später über Listen bearbeiten.
Im Moment geht es mir darum die CSV-Datei neu zu beschreiben. ( Z.B. nachdem ein Wort aufgerufen wurde, soll ein Counter nach oben zählen. Diese Manipulation mache ich in der Liste und schreibe die CSV-Datei nach dem Ende neu um das zu speichern)

Es klappt im prinzip alles wie ich mir das vorstelle, ABER beim testen schreibt das Programm lediglich 3921 Zeilen und hört dann einfach auf. Vor ein paar Minuten waren es nur 3884 Zeilen. Wo liegt der Fehler. Die ausgabe

Code: Alles auswählen

import csv

reader = csv.reader(open("English1.csv"), delimiter=";")

englisch = []
deutsch = []
sprachniveau = []
anzahl_aufrufe = []
anzahl_ungewusst = []
anzahl_ungewusst_aufrufe = []
dummy = []

for reihe in reader:
    englisch.append(reihe[0])
    deutsch.append(reihe[1])
    sprachniveau.append(reihe[2])
    anzahl_aufrufe.append(reihe[3])
    anzahl_ungewusst.append(reihe[4])
    anzahl_ungewusst_aufrufe.append(reihe[5])
    dummy.append(reihe[6])

anzahl_der_woerter = len(englisch)

writer = csv.writer(open("englisch.csv", "w"), delimiter=";")

laenge_liste = []
x = -1

while x < anzahl_der_woerter-1:
    x = x+1
    laenge_liste.append(x)

print(laenge_liste)

for reihe in laenge_liste:
    writer.writerow([laenge_liste[reihe], englisch[reihe], deutsch[reihe], sprachniveau[reihe], anzahl_aufrufe[reihe], anzahl_ungewusst[reihe], anzahl_ungewusst_aufrufe[reihe], dummy[reihe]])
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@powaaah: kann es sein, dass noch nicht alle Daten geschrieben sind, weil Du die Datei nicht wieder schließt?

Du solltest übrigens zusammengehörige Daten nicht in verschiedene Listen speichern, das macht das Verarbeiten nur unnötig fehleranfällig und kompliziert. In Deinem Fall bietet sich ein Wörterbuch an:

Code: Alles auswählen

import csv
FIELDNAMES = ["englisch", "deutsch", "sprachniveau", "anzahl_aufrufe", "anzahl_ungewusst", "anzahl_ungewusst_aufrufe", "dummy"]

with open("English1.csv") as csvfile:
    reader = csv.DictReader(csvfile, delimiter=';', fieldnames=FIELDNAMES)
    vocabularies = list(reader)

with open("englisch.csv", "w") as csvfile:
    writer = csv.DictWriter(csvfile, delimiter=";", fieldnames=FIELDNAMES)
    writer.writerows(vocabularies)
powaaah
User
Beiträge: 19
Registriert: Samstag 24. Oktober 2015, 12:42

Mh. Also ich habe mir das gerade nochmal angeschaut. Von schließen der Datei ist nirgends etwas erwähnt. Bei .txt Datein ist mir bekannt, dass nach open auch ein .close() folgen muss. Allerdings wird doch bei dir die Datei auch nicht geschlossen. (?)

Die Listen verwende ich eigentlich deswegen, weil ich mir per Zufallszahl ein Vokabel ausspucken lasse, welche ich dann gedanklich übersetze. Durch einen Button wird mir dann die Lösung angezeigt. Danach kann ich entscheiden ob ich das Wort kannte oder nicht. Mit dictionaries muss ich mir auch zwei Listen erstellen, die dann das Schlüsselwort über eine Zufallszahl bestimmen. Zudem ist die Manipulation einer Liste mit meinen beschränkten Fähigkeiten deutlich einfacher, als die Manipulation eines Dictionaries.

Wobei ich gerade sehe, dass es wohl eine Liste von Dictionaries ist.


Wie würde ich denn die Datei schließen? reader.close() (gibt es nicht als befehl)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@powaaah: Ja, ich meinte ein Wörterbuch pro Vokabel. Das File-Objekt das mit open erzeugt wird, hat eine close-Methode. Diese wird bei with automatisch aufgerufen, wenn der Block verlassen wird.
powaaah
User
Beiträge: 19
Registriert: Samstag 24. Oktober 2015, 12:42

Also erstmal vielen dank für deine Anmerkungen. Die Vorgehensweise mit den Dictionaries funktioniert ausgezeichnet.

Die Datei konnte nun auch vollständig geschrieben werden. Der Fehler lag tatsächlich im with ... as...
Antworten