DEV Community

Cover image for How to fix “ValueError: I/O operation on closed file” in Python
Reza Lavarian
Reza Lavarian

Posted on • Originally published at decodingweb.dev

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

Update: This post was originally published on my blog decodingweb.dev, where you can read the latest version for a 💯 user experience. ~reza

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.
Enter fullscreen mode Exit fullscreen mode

This quick guide explains why this error happens and how to fix it quickly.

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()
Enter fullscreen mode Exit fullscreen mode

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()
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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()
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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.

Top comments (0)