How to fix “ValueError: I/O operation on closed file” in Python
Tags: python, programming, tutorial, beginners
Published: 2023-05-11 16:28:11

> ✋ **Update:** This post was originally published on my blog [decodingweb.dev](https://www.decodingweb.dev), where you can read the [latest version](https://www.decodingweb.dev/python-valueerror-io-operation-on-closed-file-fix) 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.
```

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. <u>Incorrect indentation</u>
2. <u>Closing the file prematurely</u>

## Incorrect indentation

[Incorrect indentation](https://www.decodingweb.dev/python-taberror-inconsistent-use-of-tabs-and-spaces-in-indentation-fix) 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.


```python
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:

```python
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:

```python
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:

```python
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. 

```python
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.

```python
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:

```python
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.