Lösen Sie den ValueError: E/A-Vorgang für geschlossene Datei in Python

Jay Shaw 8 Oktober 2023
  1. Lösen Sie den ValueError: I/O operation on closed file Due to Inproper Indentation in Python
  2. Lösen Sie den ValueError: I/O operation on closed file Due to Closing File Inside the for Loop in Python
  3. Lösen Sie den ValueError: I/O operation on closed file (Wertfehler: E/A-Vorgang für geschlossene Datei) aufgrund der Durchführung eines Schreibvorgangs für eine geschlossene Datei
  4. Abschluss
Lösen Sie den ValueError: E/A-Vorgang für geschlossene Datei in Python

Ressourcenmanagement ist ein wichtiger Faktor bei der Programmierung. Aber oft lassen Programmierer unwissentlich einen Speicherblock offen, was zu Speicherüberläufen führen kann.

Dieser Artikel befasst sich jedoch mit einem Fehler in Python: ValueError: I/O operation on closed file. Dies geschieht, wenn der Programmierer versucht, Operationen an einer Datei durchzuführen, die zwischen den Operationen irgendwie geschlossen wird.

Es gibt hauptsächlich drei Fälle, in denen der ValueError: I/O operation on closed file auftreten kann:

Lösen Sie den ValueError: I/O operation on closed file Due to Inproper Indentation in Python

Angenommen, ein Programmierer hat eine .csv-Datei, die er versucht, mit einem Python-Compiler in den Speicher zu laden. In Python muss eine Objektvariable erstellt werden, um den Inhalt der Datei zum Lesen oder Schreiben in eine Datei zu laden.

Lassen Sie uns dies anhand des folgenden Programms verstehen:

import csv

# Open the file in Read mode
with open("sample_submission.csv", "r") as employees:
    read_csv = csv.reader(employees)

Dieses Programm importiert das Bibliothekspaket csv, um .csv-Dateien zu lesen. In der zweiten Codezeile verwendet das Programm die with-Anweisung, um einen Ausnahmebehandlungsblock zu erstellen, und speichert die .csv-Datei sample_submission.csv im Objekt employees als lesbare Einheit mit dem Schlüsselwort R.

Wir müssen etwas Speicher zuweisen, um die Entität Mitarbeiter zu lesen. Zeile 3 des Codes weist read_csv einen Speicherblock zu, um die Inhalte von employees zu speichern.

Wenn der Programmierer die Zeilen aus der .csv-Datei anzeigen möchte, muss er die Zeilen aus dem Objekt read_csv innerhalb einer for-Schleife drucken, genau wie im folgenden Code:

import csv

# Open the file in Read mode
with open("sample_submission.csv", "r") as employees:
    read_csv = csv.reader(employees)

# iterate and print the rows of csv
for row in read_csv:
    print("Rows: ", row)

Aber wenn der Programmierer versucht, dieses Stück Code zu kompilieren, erhält er eine Fehlermeldung:

"C:\Users\Win 10\main.py"
Traceback (most recent call last):
  File "C:\Users\Win 10\main.py", line 8, in <module>
    for row in read_csv:
ValueError: I/O operation on closed file.

Process finished with exit code 1

Der ValueError: I/O operation on closed file ist aufgrund der Ausnahmebehandlungsanweisung with aufgetreten. Wie bereits erwähnt, erstellt die with-Anweisung einen Ausnahmebehandlungsblock, und jede darin initiierte Operation wird beendet, sobald der Compiler diesen Block verlässt.

Im obigen Programm verursachte ein Einrückungsfehler den Fehler. Python-Compiler verwenden kein Semikolon, um das Ende einer Zeile zu kennzeichnen; Stattdessen wird Speicherplatz verwendet.

Im Code wurde die for-Schleife ausserhalb des with-Blocks erstellt und damit die Datei geschlossen. Obwohl die for-Schleife direkt unter with geschrieben wurde, ließ eine falsche Einrückung den Compiler denken, dass die for-Schleife außerhalb des with-Blocks liegt.

Eine Lösung für dieses Problem besteht darin, die richtigen Einzüge wie folgt zu identifizieren:

import csv

with open("sample_submission.csv", "r") as employees:
    read_csv = csv.reader(employees)

    # for loop is now inside the with block
    for row in read_csv:
        print("Rows: ", row)

Ausgang:

"C:\Users\Win 10\main.py"
Rows:  ['Employee ID', 'Burn Rate']
Rows:  ['fffe32003000360033003200', '0.16']
Rows:  ['fffe3700360033003500', '0.36']
Rows:  ['fffe31003300320037003900', '0.49']
Rows:  ['fffe32003400380032003900', '0.2']
Rows:  ['fffe31003900340031003600', '0.52']

Process finished with exit code 0

Lösen Sie den ValueError: I/O operation on closed file Due to Closing File Inside the for Loop in Python

Dieses Beispiel zeigt, wie der ValueError: I/O operation on closed file ohne Verwendung der with-Anweisung erfolgen kann. Wenn ein Python-Skript eine Datei öffnet und innerhalb einer Schleife etwas darauf schreibt, muss es am Ende des Programms geschlossen werden.

Aber der ValueError: I/O operation on closed file kann aufgrund einer expliziten Dateischliessung innerhalb der Schleife entstehen. Wie oben erklärt, schließt der with-Block alles, was darin initiiert wurde.

Aber in Fällen, in denen for-Schleifen usw. verwendet wurden, tritt der ValueError: I/O operation on closed file auf, wenn die Datei mitten in der Schleife geschlossen wird. Mal sehen, wie dies durch das folgende Programm geschieht:

a = 0
b = open("sample.txt", "r")
c = 5

f = open("out" + str(c) + ".txt", "w")
for line in b:
    a += 1
    f.writelines(line)
    if a == c:
        a = 0
    f.close()
f.close()

Der obige Code liest Inhalte aus der Datei sample.txt und schreibt diese Inhalte dann in eine neue Datei mit dem Namen out(value of c).txt.

Die Variable b wird mit der Datei sample.txt geladen, während die Variable f zum Schreiben auf eine neue Datei verwendet wird. Die for-Schleife läuft für die Anzahl der Zeilen in der in b geladenen Datei.

Jede Iteration erhöht a, während bei der Iteration bei a=5 der Wert von a auf Null zurückgesetzt wird.

Nach Abschluss des Vorgangs wird zweimal f.close() verwendet. Das erste f.close löscht f, während das zweite b löscht.

Das Programm musste jedoch weitere Iterationen ausführen, bevor die Datei geschlossen wurde. Wenn das Programm kompiliert ist, gibt es die folgende Ausgabe aus:

"C:\Users\Win 10\main.py"
Traceback (most recent call last):
  File "C:\Users\Win 10\main.py", line 8, in <module>
    f.writelines(line)
ValueError: I/O operation on closed file.

Process finished with exit code 1

Dies geschieht, weil die Datei innerhalb der for-Schleife geschlossen wird, wodurch die Datei für nachfolgende Iterationen nicht gelesen werden kann.

Da dieser Fehler versehentlich verursacht wird, müssen Sie zum Beheben des Fehlers zum Code zurückkehren und erneut prüfen, wo die Datei geschlossen wird. Wenn es sich um eine for-Schleife handelt, sollte eine Datei außerhalb des Einzugs der Schleife geschlossen werden, wodurch die Schleife alle ihre Iterationen abschließen und dann den Speicher freigeben kann.

a = 0
b = open("sample.txt", "r")
c = 5

f = open("out" + str(c) + ".txt", "w")
for line in b:
    a += 1
    f.writelines(line)
    if a == c:
        a = 0

f.close()

Hier wird die Datei außerhalb der Einrückung der for-Schleife geschlossen, sodass der Compiler die Datei nach Abschluss aller Iterationen schließt.

Wenn der Code kompiliert ist, gibt er beim Erstellen einer Datei mit dem Namen out5.txt keine Fehler aus:

"C:\Users\Win 10\main.py"

Process finished with exit code 0

Lösen Sie den ValueError: I/O operation on closed file (Wertfehler: E/A-Vorgang für geschlossene Datei) aufgrund der Durchführung eines Schreibvorgangs für eine geschlossene Datei

Dies ist ein Szenario, in dem der Programmierer einer Datei, die zuvor geschlossen wurde, schriftliche Anweisungen gibt und deren Kompilierung den Fehler ValueError: I/O operation on closed file erzeugt.

Schauen wir uns ein Beispiel an:

with open("gh.txt", "w") as b:
    b.write("Apple\n")
    b.write("Orange \n")
    b.write("Guava \n")
    b.close()
    b.write("grapes")

Das Programm lädt eine .txt-Datei als Objekt b. Dann wird diese Objektvariable b verwendet, um Schreiboperationen innerhalb der .txt-Datei durchzuführen.

Wenn dieser Code kompiliert wird, tritt der ValueError: I/O operation on closed file auf.

"C:\Users\Win 10\main.py"
Traceback (most recent call last):
  File "C:\Users\Win 10\main.py", line 6, in <module>
    b.write("grapes")
ValueError: I/O operation on closed file.

Process finished with exit code 1

Dies wurde durch die Anweisung b.close() verursacht, die über eine schriftliche Erklärung geschrieben wurde. Der Compiler lässt die Datei nicht mehr schreiben, auch nicht innerhalb des with-Blocks.

Um dieses Problem zu lösen, sollte das Programm entweder ohne die with-Anweisung neu geschrieben werden, wenn das Hinzufügen von b.close erforderlich ist:

b = open("gh.txt", "w")
b.write("Apple\n")
b.write("Orange \n")
b.write("Guava \n")
b.write("grapes")
b.close()

Oder die Anweisung b.close() muss aus der Anweisung with entfernt werden, damit sie ausgeführt wird:

with open("gh.txt", "w") as b:
    b.write("Apple\n")
    b.write("Orange \n")
    b.write("Guava \n")
    b.write("grapes")

Beide Codeblöcke führen die gleiche Arbeit aus, aber die Verwendung der with-Anweisung fügt die Ausnahmebehandlung hinzu und bereinigt den Code.

Abschluss

Dieser Artikel hat die verschiedenen Gründe erläutert, die den ValueError: I/O operation on closed file verursachen können. Der Leser soll die mit-Aussagen verstehen und in Zukunft richtig anwenden.

Verwandter Artikel - Python Error