Lösen Sie den ValueError: E/A-Vorgang für geschlossene Datei in Python
-
Lösen Sie den
ValueError: I/O operation on closed file
Due to Inproper Indentation in Python -
Lösen Sie den
ValueError: I/O operation on closed file
Due to Closing File Inside thefor
Loop in Python -
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 - Abschluss
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
- Adresse wird bereits verwendet Fehler in Python
- AttributeError: __Exit__ in Python
- AttributeError: 'Dict'-Objekt hat kein Attribut 'Append' in Python
- AttributeError: 'NoneType'-Objekt hat kein Attribut 'Text' in Python
- AttributeError: Int-Objekt hat kein Attribut
- AttributeError: Modul Urllib hat keine Attributanforderung