Seite 1 von 1

ValueError: I/O operation on closed file.

Verfasst: Mittwoch 25. April 2018, 13:33
von Gnu86
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]

Re: ValueError: I/O operation on closed file.

Verfasst: Mittwoch 25. April 2018, 14:25
von Sirius3
@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.

Re: ValueError: I/O operation on closed file.

Verfasst: Mittwoch 25. April 2018, 19:16
von snafu
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.