The Python error “ValueError: I/O operation on closed file” happens when you try to do I/O operations (read, write, etc.) on a file that’s already been closed.
Here’s what the error looks like:
Traceback (most recent call last): File "/dwd/app.py", line 2, in for line in file: ValueError: I/O operation on closed file.
This quick guide explains why this error happens and how to fix it quickly.
This error usually happens for two reasons:
- Incorrect indentation
- Closing the file prematurely
Incorrect indentation can cause the "ValueError: I/O operation on closed file" error when working with files in Python. Below are two scenarios leading to this error.
Scenario #1: closing the file inside a loop: Imagine you have a loop that reads data from a file.
However, you unintentionally close the file at the same indentation level as the loop, making it part of the loop.
As a result, when you try to read the second line of the file, you'll get the error because the file was closed in the first iteration.
file = open('data.txt', 'r') for line in file: print(line) # file is closed here file.close()
In the above code, since
file.close() is indented within the loop (by mistake), the file is closed prematurely, causing the error.
To fix this issue, move the
file.close() outside the loop, and you'll be good to go:
file = open('data.txt', 'r') for line in file: print(line) # Closing the file after the loop finishes file.close()
Scenario #2: Using the
with statement: As you probably know, when you open a file using the
with statement, you won't have to close the file at the end. Python automatically closes the file for you once the execution block finishes executing.
That said, if you have an I/O operation outside the
with block, you'll run into the error since the file is closed.
Imagine we're trying to read a CSV file using the
with open('...') syntax:
import csv with open('users.csv', 'r') as file: csv_reader = csv.reader(file) for row in csv_reader: print(row)
In the above example, we open a file using the
with statement, where we create a CSV reader object to iterate over lines and print each line.
for loop is indented outside of the
with block, making it run after with statement closes the file.
To fix this issue, ensure all I/O operations are part of the
import csv with open('keywords.csv', r) as file: csv_reader = csv.reader(file) for line in csv_reader: print(line)
Another common cause of this ValueError error is closing the file prematurely before performing any I/O operations.
This might happen if you've copied a code from another source, like Stackoverflow or another file but forget to reorder the lines.
Imagine you want to read data from a file and store it in a list.
file = open('file.txt', 'r') data =  file.close() for line in file: data.append(line)
In the above example,
file.close() appears before we read the lines from the file.
file.close() fixes the issue instantly.
file = open('file.txt', 'r') data =  for line in file: data.append(line) file.close()
To check whether a file is closed, you can use the
closed attribute of the respective file object. The closed attribute contains a boolean value indicating whether the file is open or closed.
Here's an example:
file = open('example.txt', 'r') print(file.closed) # False file.close() print(file.closed) # True
You might find this attribute helpful when debugging your code.
The Python error "ValueError: I/O operation on closed file" typically occurs when a file is closed prematurely or due to incorrect indentation.
It's a simple rule; Just ensure the code that closes the file is executed after the I/O operations.
Alright, I think it does it! I hope you found this quick guide helpful.
Thanks for reading.