ValueError: I/O operation on closed file.

Code-Stücke können hier veröffentlicht werden.
Antworten
Gnu86
User
Beiträge: 1
Registriert: Mittwoch 25. April 2018, 13:24

Hallo zusammen, ich bin gerade dabei ein Karteikastensystem zu programmieren. und will mit csv eine Reihe (deutsch,englisch,flag) hinzufügen.
Ich bekomme jedoch jedes mal einen I/O VAlue error.
Kann mir jemand sagen woran das liegen könnte und wie ich die eingegebene Reihe hinzufügen kann

Code: Alles auswählen

class Entry:

    def __init__(self, DEUTSCH, ENGLISCH, FLAG):
        self.DEUTSCH = DEUTSCH
        self.ENGLISCH = ENGLISCH
        self.FLAG = FLAG

APPEND = open("Vokabeln.csv", 'a')
LIST = []
LIST2 = []
LIST3 = []
LIST4 = []
LIST5 = []


with open('Vokabeln.csv') as INPUTFILE:
    reader = csv.reader(INPUTFILE.readlines())

with open('Vokabeln.csv', 'a') as OUTPUTFILE:
    writer = csv.writer(OUTPUTFILE)

    try:
        for line in reader:
            if line[2] == '1':
                LIST.append(Entry(line[0], line[1], line[2]))
            elif line[2] == '2':
                LIST2.append(Entry(line[0], line[1], line[2]))
            elif line[2] == '3':
                LIST3.append(Entry(line[0], line[1], line[2]))
            elif line[2] == '4':
                LIST4.append(Entry(line[0], line[1], line[2]))
            elif line[2] == '5':
                LIST5.append(Entry(line[0], line[1], line[2]))
    except Exception:
        print('error')


def eingabe():
    while True:

        DEUTSCH = input("Bitte deutsches Wort eingeben: ")
        if DEUTSCH == "exit":
            return
        ENGLISCH = input("Bitte englisches Wort eingeben: ")
        if ENGLISCH == "exit":
            return
        FLAG = "1"

        LIST.append(Entry(DEUTSCH,ENGLISCH,FLAG))
        writer.writerow([Entry(DEUTSCH,ENGLISCH,FLAG)])
        writer.close()

while True:
    print("Für die Anleitung geben sie bitte 'help' ein \n")

    MENUE = input("Bitte gebe einen Befehl ein : ")

    if MENUE == "eingabe":
        eingabe()

[codebox=text file=Unbenannt.txt]deutsch,englisch,0
vater,father,1
mutter,mother,1
haus,house,1[/code]
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Gnu86: Variablen werden generell komplett klein geschrieben. Deine GROSSSCHREIBUNG verwirrt jeden Leser, der anderes gewöhnt ist, enorm.
`APPEND` und `writer` werden nicht benutzt. Auch sollte man nicht einfach eine Datei so zum Schreiben öffnen und gleichzeitiges Lesen und Schreiben in die selbe Datei sollte man vermeiden. Jetzt wäre es noch ganz toll, wenn Du den kompletten Traceback posten würdest, denn dann müßte man nicht raten, wie der Fehler aussieht und wo er auftritt.

Statt viele Listen in unterschiedlichen Variablen, ist es besser, ein Wörterbuch zu benutzen. Dann fällt auch die if-Kaskade und der viele kopierte Code weg.

Exceptions sollten so konkret wie möglich abgefangen werden und sinnvoll verarbeitet werden. Du bekommst bei irgendeinem Fehler einfach nur "error" ausgegeben. Damit kann niemand was anfangen. Am besten das Exceptionhandling ersatzlos streichen.

In Zeile 50 benutzt Du einen `writer` der gar nicht (mehr) existiert. Dort wo Du etwas in eine Datei schreiben willst, mußt Du sie auch öffnen.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sirius3 hat geschrieben:In Zeile 50 benutzt Du einen `writer` der gar nicht (mehr) existiert. Dort wo Du etwas in eine Datei schreiben willst, mußt Du sie auch öffnen.
Der writer existiert dort schon noch, da er ja auf Modulebene definiert wurde. Jedoch ist die Datei, die vom writer benutzt wird, an der Stelle nicht mehr offen, da der writer außerhalb des with-Blocks in die Datei schreiben soll. Und daher erfolgt die Fehlermeldung.
Antworten