IsADirectoryError: Errno 21 Is a directory (Fix)
IsADirectoryError: [Errno 21] Is a directory happens when your Python code tries to open, read, write, or otherwise use a folder path where Python expects a file path.
This is a common beginner error when working with open(), file paths, or folder loops. The fix is usually simple: check the path, confirm whether it points to a file or a directory, and use the right operation for that path.
Quick fix
path = "data.txt" # use a file path, not a folder path
with open(path, "r") as file:
content = file.read()
print(content)
This error usually means the path points to a folder instead of a file.
What this error means
Python is telling you:
- It expected a file path
- The path you gave points to a directory (folder)
- This often happens with
open(),os.remove(), or similar file operations - A directory and a file are different things in Python and in your operating system
For example, this path is a directory:
path = "my_folder"
But this path is a file:
path = "my_folder/data.txt"
If you want to learn more about how file paths work, see working with file paths in Python.
Why this happens
This error usually appears for one of these reasons:
- You passed a folder name to
open() - You built the path incorrectly
- You used a variable that contains a directory path instead of a file path
- You looped through directory names and tried to open each one as a file
- You expected a file like
data.txtbut only used the parent folder path
Common causes
- Using
open()with a folder path - Passing a directory to
os.remove()or another file-only function - Forgetting to include the file name in the path
- Incorrectly joining paths in loops
- Reading items from
os.listdir()without checking their type
Example that causes the error
Here is a simple example:
with open("my_folder", "r") as file:
content = file.read()
If "my_folder" is a real folder, Python raises:
IsADirectoryError: [Errno 21] Is a directory: 'my_folder'
Python cannot read a folder as if it were a text file.
The fix is to open a real file inside that folder:
with open("my_folder/data.txt", "r") as file:
content = file.read()
print(content)
If you need a refresher on file reading, see how to read a file in Python or the Python open() function explained.
How to fix it
When you see this error, go through these checks:
- Check the exact path stored in your variable
- Make sure the path includes the file name and extension
- Use
os.path.isfile()before opening a path - Use
os.path.isdir()if you want to work with folders - List files in the folder first, then open one file at a time
A safe pattern looks like this:
import os
path = "my_folder/data.txt"
if os.path.isfile(path):
with open(path, "r") as file:
print(file.read())
else:
print("This path is not a file.")
This prevents your code from trying to open a directory as a file.
Fix by checking file vs directory
When a path might be either a file or a folder, test it first.
import os
path = "my_folder"
print(os.path.isfile(path)) # True if it is a file
print(os.path.isdir(path)) # True if it is a directory
This helps because:
os.path.isfile(path)confirms it is a fileos.path.isdir(path)confirms it is a directory- You can choose the correct operation
- It is especially useful when paths come from user input or loops
Example:
import os
path = "my_folder"
if os.path.isfile(path):
with open(path, "r") as file:
print(file.read())
elif os.path.isdir(path):
print("This is a folder, not a file.")
else:
print("The path does not exist.")
You can also check whether a path exists first with os.path.exists().
Fix when looping through folder contents
This error often happens in loops.
A beginner might write code like this:
import os
folder = "my_folder"
for name in os.listdir(folder):
with open(name, "r") as file:
print(file.read())
There are two problems here:
namemay be a directory, not a filenameis not joined to the folder path
A better version is:
import os
folder = "my_folder"
for name in os.listdir(folder):
path = os.path.join(folder, name)
if os.path.isfile(path):
with open(path, "r") as file:
print(file.read())
else:
print(f"Skipping directory: {path}")
This works better because:
- Some folders contain subfolders as well as files
- It does not assume every item from
os.listdir()is a file - It joins the folder path and item name correctly
- It skips directories or handles them separately
If you want to learn more, see os.listdir() explained.
Debugging steps
If you are not sure why the error is happening, check the path before the failing line.
Useful debugging commands:
print(path)
import os
print(os.path.exists(path))
print(os.path.isfile(path))
print(os.path.isdir(path))
print(os.getcwd())
print(os.listdir(path))
Here is what each one helps you find:
print(path)shows the exact value being usedos.path.exists(path)tells you whether the path existsos.path.isfile(path)tells you whether it is a fileos.path.isdir(path)tells you whether it is a folderos.getcwd()shows the current working directoryos.listdir(path)shows the contents of a folder
A simple debugging example:
import os
path = "my_folder"
print("Path:", path)
print("Exists:", os.path.exists(path))
print("Is file:", os.path.isfile(path))
print("Is directory:", os.path.isdir(path))
print("Current working directory:", os.getcwd())
Use these steps to look for:
- Missing file names
- Wrong path joins
- A folder path being used with
open() - The script running in a different directory than you expected
Related errors
This error is part of a larger group of file system errors.
FileNotFoundErrorhappens when the path does not existPermissionErrorhappens when the path exists but access is deniedNotADirectoryErrorhappens when code expects a folder but gets a fileOSErroris the broader error family that includes this error
Related pages:
- FileNotFoundError: Errno 2 No such file or directory
- NotADirectoryError: Errno 20 Not a directory
- PermissionError: Errno 13 Permission denied
FAQ
What does IsADirectoryError mean in Python?
It means your code used a folder path where Python expected a file path.
Why does open() say Is a directory?
Because the path passed to open() points to a directory instead of a file.
How do I fix Errno 21 Is a directory?
Use the full path to a real file, or check the path first with os.path.isfile().
How can I tell if a path is a file or folder?
Use os.path.isfile(path) for files and os.path.isdir(path) for folders.
Can os.listdir() cause this error?
Yes. If you loop through items and try to open every item, some may be directories.