How to fix “ValueError: I/O operation on closed file” in Python

Updated Sep 22, 2023 ⤳ 4 min read

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.

🎧 Debugging Jam

Calling all coders in need of a rhythm boost! Tune in to our 24/7 Lofi Coding Radio on YouTube, and let's code to the beat – subscribe for the ultimate coding groove!" Let the bug-hunting begin! 🎵💻🚀

24/7 lofi music radio banner, showing a young man working at his computer on a rainy autmn night with hot drink on the desk.

How to fix it?

This error usually happens for two reasons:

  1. Incorrect indentation
  2. Closing the file prematurely

Incorrect indentation

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.

However, the 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 with block:


import csv

with open('keywords.csv', r) as file:
    csv_reader = csv.reader(file)
    
    for line in csv_reader:
        print(line)

Closing the file prematurely

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.

Placing file.close() fixes the issue instantly.


file = open('file.txt', 'r')
data = []

for line in file:
    data.append(line)

file.close()

You can also check if a file is closed

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.

Wrapping up

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.

Disclaimer: This post may contain affiliate links. I might receive a commission if a purchase is made. However, it doesn’t change the cost you’ll pay.

`