Ошибка ValueError: операция ввода-вывода с закрытым файлом обычно возникает, когда вы «пытаетесь выполнить операцию с закрытым файлом». Если вы закроете файл по ошибке или не закроете его до выхода из программы, вы получите ошибку «операция ввода-вывода над закрытым файлом».
Существует два распространенных сценария, в которых «ValueError: операция ввода-вывода в закрытом файле» возникает ошибка:
- Когда вы забываете правильно сделать отступ в коде в операторе «with»
- Когда вы пытаетесь прочитать файл после его закрытия с помощью оператора close()
- Причина № 1: Неправильный отступ
- Как это исправить?
- Причина 2: доступ к закрытому файлу
- Как это исправить?
- Правильно сделайте отступ в своем коде в операторе with open()
- Убедитесь, что вы не перепутали табуляцию и пробелы
- Обязательно НЕ взаимодействуйте с файловым объектом за пределами блока with
- Использование функции open() вместо оператора with
Причина № 1: Неправильный отступ
|
1 2 3 4 5 6 7 8 |
import csv with open("data.csv", "r") as students: read_file = csv.reader(students) for s in read_file: print("Points: " + s[0]) |
Выход
|
1 |
ValueError: I/O operation on closed file. |
Вы можете видеть, что код возвращает ошибку. Это связано с тем, что мы попытались перебрать «read_file» вне нашего оператора with. Переменная «read_file» может читаться только внутри оператора with. После выполнения оператора with файл закрывается.
Как это исправить?
Чтобы исправить этот код, нам нужно сделать отступ для цикла for внутри оператора with.
|
1 2 3 4 5 6 7 |
import csv with open("data.csv", "r") as data: read_file = csv.reader(data) for d in range(1, read_file): print(int(d)) |
Причина 2: доступ к закрытому файлу
Когда вы открываете файл с помощью оператора with, вам не придется закрывать файл в конце. Python автоматически закрывает файл после завершения выполнения блока выполнения.
Тем не менее, если у вас есть операция ввода-вывода за пределами блока with, вы столкнетесь с ошибкой, поскольку файл закрыт.
Добавьте следующий контент, чтобы создать текстовый файл с именем app.txt в папке вашего проекта.
|
1 |
The Last Of Us |
Напишите программу на Python, которая открывает файл app.txt, считывает его содержимое, закрывает его, снова читает открытый файл и печатает его содержимое.
|
1 2 3 4 5 6 |
file = open('app.txt', 'r') contents = file.read() file.close() contents = file.read() print(contents) |
Выход
|
1 |
ValueError: I/O operation on closed file. |
В этом примере функция open() открывает файл app.txt в режиме чтения.
Мы использовали функцию file.read() для чтения содержимого файла и сохранения его в переменной с именемcontents.
Чтобы закрыть файл, мы использовали метод file.close().
После закрытия файла программа снова пытается прочитать файл, но, поскольку файл уже был закрыт, интерпретатор выдает ошибку «ValueError: операция ввода-вывода в закрытом файле».
Как это исправить?
Оператор with open() позволяет вам открыть файл и автоматически закрыть его, когда вы закончите с ним работать. Оператор with open() автоматически закрывает файл, даже если генерируется исключение.
|
1 2 3 4 5 6 |
with open('app.txt', 'r') as file: contents = file.read() print(contents) contents = file.read() print(contents) |
Выход
|
1 2 |
The Last Of Us |
В приведенном выше коде функция open() и оператор with используются для открытия файла app.txt в режиме чтения.
Мы использовали функцию file.read() для чтения содержимого файла, сохранения его в переменной содержимого и печати.
Файл не закрывается явно; он закроется автоматически при выходе из блока «с оператором».
Затем программа снова пытается прочитать файл, но это работает, поскольку он все еще открыт в контексте оператора with.
Из вывода программы видно, что теперь, даже после печати содержимого, она не выдает ValueError.
Правильно сделайте отступ в своем коде в операторе with open()
Сделайте отступ в коде правильно и переместите его в оператор with, не смешивая табуляции и пробелы. Синтаксис with open() обеспечивает автоматическое закрытие файла даже в случае возникновения исключения.
Убедитесь, что вы не перепутали табуляцию и пробелы
Вы можете получить эту ошибку, если используете табуляцию и пробелы для обозначения строки кода.
Обязательно НЕ взаимодействуйте с файловым объектом за пределами блока with
Если вы попытаетесь взаимодействовать с файловым объектом вне оператора with open(), файл уже будет закрыт.
Использование функции open() вместо оператора with
Но следует помнить одну вещь: когда мы используем функцию open() без оператора «with open», нам придется закрыть файл вручную.
