Resuelva el ValueError: operación de E/S en un archivo cerrado en Python

Jay Shaw 21 junio 2023
  1. Resuelva el ValueError: operación de E/S en un archivo cerrado debido a una sangría incorrecta en Python
  2. Resuelva el ValueError: operación de E/S en archivo cerrado debido al cierre de archivo dentro del bucle for en Python
  3. Resolver el ValueError: operación de E/S en archivo cerrado debido a realizar una operación de escritura en un archivo cerrado
  4. Conclusión
Resuelva el ValueError: operación de E/S en un archivo cerrado en Python

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