Resuelva el ValueError: operación de E/S en un archivo cerrado en Python
-
Resuelva el
ValueError: operación de E/S en un archivo cerrado
debido a una sangría incorrecta en Python -
Resuelva el
ValueError: operación de E/S en archivo cerrado
debido al cierre de archivo dentro del buclefor
en Python -
Resolver el
ValueError: operación de E/S en archivo cerrado
debido a realizar una operación de escritura en un archivo cerrado - Conclusión
La gestión de recursos es un factor importante en la programación. Pero a menudo, los programadores, sin saberlo, dejan un bloque de memoria abierto, lo que puede causar desbordamientos de memoria.
Este artículo, sin embargo, analiza un error en Python: ValueError: operación de E/S en archivo cerrado
. Esto sucede cuando el programador intenta realizar operaciones en un archivo que de alguna manera se cierra entre operaciones.
Existen principalmente tres casos en los que puede ocurrir el ValueError: operación de E/S en archivo cerrado
:
Resuelva el ValueError: operación de E/S en un archivo cerrado
debido a una sangría incorrecta en Python
Supongamos que un programador tiene un archivo .csv
que intenta cargar en la memoria usando un compilador de Python. En Python, se debe crear una variable de objeto para cargar el contenido del archivo para leer o escribir en un archivo.
Entendamos esto a través del siguiente programa:
import csv
# Open the file in Read mode
with open("sample_submission.csv", "r") as employees:
read_csv = csv.reader(employees)
Este programa importa el paquete de biblioteca csv
para leer archivos .csv
. En la segunda línea de código, el programa usa la declaración with
para crear un bloque de manejo de excepciones y almacena el archivo .csv
, sample_submission.csv
, dentro del objeto employees
como una entidad legible usando la palabra clave r
.
Necesitamos asignar algo de memoria para leer la entidad empleados
. La línea 3 del código asigna un bloque de memoria a “read_csv” para almacenar los contenidos de “empleados”.
Si el programador quiere mostrar las filas del archivo .csv
, necesita imprimir las filas del objeto read_csv
dentro de un bucle for
, como en el siguiente código:
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)
Pero cuando el programador intenta compilar este fragmento de código, recibe un error:
"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
El ValueError: operación de E/S en un archivo cerrado
ocurrió debido a la declaración de manejo de excepciones con
. Como se dijo anteriormente, la declaración with
crea un bloque de manejo de excepciones, y cualquier operación iniciada dentro terminará tan pronto como el compilador salga de este bloque.
En el programa anterior, un error de sangría causó el error. Los compiladores de Python no usan un punto y coma para identificar el final de una línea; en su lugar, utiliza el espacio.
En el código, el bucle for
se creó fuera del bloque with
, cerrando así el archivo. Aunque el bucle for
se escribió justo debajo de with
, la sangría incorrecta hizo que el compilador pensara que el bucle for
está fuera del bloque with
.
Una solución a este problema es identificar las sangrías adecuadas como las siguientes:
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)
Producción :
"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
Resuelva el ValueError: operación de E/S en archivo cerrado
debido al cierre de archivo dentro del bucle for
en Python
Este ejemplo muestra cómo el ValueError: operación de E/S en un archivo cerrado
puede ocurrir sin usar la instrucción with
. Cuando un script de Python abre un archivo y escribe algo en él dentro de un bucle, debe cerrarse al final del programa.
Pero el ValueError: operación de E/S en archivo cerrado
puede surgir debido a un archivo explícito que se cierra dentro del ciclo. Como se explicó anteriormente, el bloque with
cierra todo lo que se haya iniciado en su interior.
Pero en los casos en los que se han utilizado bucles for
, etc., el ValueError: operación de E/S en archivo cerrado
se produce cuando el archivo se cierra a la mitad del bucle. Veamos cómo sucede esto a través del siguiente programa:
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()
El código anterior lee el contenido del archivo sample.txt
y luego escribe ese contenido en un nuevo archivo con el nombre out (valor de c).txt
.
La variable b
se carga con el archivo sample.txt
, mientras que la variable f
se utiliza para escribir en un nuevo archivo. El bucle for
se ejecuta durante el número de líneas dentro del archivo cargado dentro de b
.
Cada iteración aumenta a
, mientras que en la iteración cuando a=5
, el valor de a
se restablece a cero.
Después de completar el proceso, f.close()
se usa dos veces. El primero f.close
borra f
, mientras que el segundo borra b
.
Pero el programa tuvo que ejecutar más iteraciones antes de que se cerrara el archivo. Cuando se compila el programa, da el siguiente resultado:
"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
Esto sucede porque el archivo está cerrado dentro del bucle for
, lo que hace que no pueda leer el archivo para iteraciones posteriores.
Como este error se produce accidentalmente, resolverlo requiere volver al código y volver a verificar dónde se cierra el archivo. Si es un bucle for
, entonces se debe cerrar un archivo fuera de la sangría del bucle, lo que permite que el bucle complete todas sus iteraciones y luego libere la memoria.
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()
Aquí, el archivo se cierra fuera de la sangría del bucle for
, por lo que el compilador cierra el archivo después de completar todas las iteraciones.
Cuando se compila el código, no arroja errores al crear un archivo llamado out5.txt
:
"C:\Users\Win 10\main.py"
Process finished with exit code 0
Resolver el ValueError: operación de E/S en archivo cerrado
debido a realizar una operación de escritura en un archivo cerrado
Este es un escenario de caso en el que el programador da instrucciones escritas a un archivo que se ha cerrado antes, y compilarlo produce el error ValueError: operación de E/S en archivo cerrado
.
Veamos un ejemplo:
with open("gh.txt", "w") as b:
b.write("Apple\n")
b.write("Orange \n")
b.write("Guava \n")
b.close()
b.write("grapes")
El programa carga un archivo .txt
como objeto b
. Luego, esta variable de objeto b
se usa para realizar operaciones de escritura dentro del archivo .txt
.
Cuando se compila este código, se produce el ValueError: operación de E/S en archivo cerrado
.
"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
Esto fue causado por la declaración b.close()
, que se escribió sobre una declaración escrita. El compilador ya no permite escribir el archivo, ni siquiera dentro del bloque with
.
Para resolver este problema, el programa debe volver a escribirse sin la declaración with
si se requiere agregar b.close
:
b = open("gh.txt", "w")
b.write("Apple\n")
b.write("Orange \n")
b.write("Guava \n")
b.write("grapes")
b.close()
O la declaración b.close()
debe eliminarse de la declaración with
para que se ejecute:
with open("gh.txt", "w") as b:
b.write("Apple\n")
b.write("Orange \n")
b.write("Guava \n")
b.write("grapes")
Ambos bloques de código ejecutan el mismo trabajo, pero el uso de la instrucción with
agrega el manejo de excepciones y aclara el código.
Conclusión
Este artículo ha explicado las diversas razones que pueden causar el ValueError: operación de E/S en archivo cerrado
. El lector debe comprender las declaraciones con
y usarlas correctamente en el futuro.
Artículo relacionado - Python Error
- Administrar fallas de segmentación en Python
- Archivo <Stdin>, Línea 1, en <Módulo> Error en Python
- Arreglar AttributeError: el objeto 'generador' no tiene atributo 'siguiente' en Python
- Arreglar el comando cl.exe falló: no existe tal archivo o directorio en Windows
- Arreglar NameError: la variable no está definida en Python
- Arreglar Socket.Gaierror: [Errno 8] Nodename ni Servname proporcionado, o desconocido en Python