Skip to content

How to Check Directory Existence Safely in Python

Learn how to reliably verify a directory exists in Python using pathlib.Path.is_dir() or os.path.isdir(), while avoiding false positives from files or permission errors.

When performing file system operations in Python, verifying that a target directory exists is a fundamental step. However, a simple check can be misleading: a path might exist but point to a file instead of a directory, or permissions might prevent access.

This guide explores how to robustly check for directory existence using the modern pathlib module and the traditional os module, while also handling potential errors like permissions and race conditions.

Understanding the Check: Exists vs. Is Directory

A common mistake is checking only if a path exists. In Linux and Windows, a path can refer to a file, a directory, or a symbolic link. To be "safe," you must verify two things:

  1. Does the path exist?
  2. Is the path actually a directory?

Introduced in Python 3.4, pathlib offers an object-oriented approach to filesystem paths. It is generally preferred over os.path for modern Python code.

Using Path.is_dir()

The .is_dir() method is the most robust check. It returns True only if the path exists and is a directory.

from pathlib import Path

folder_path = Path("data_backup")

if folder_path.is_dir():
    print(f"Success: '{folder_path}' exists and is a directory.")
else:
    print(f"Check failed: '{folder_path}' does not exist or is not a directory.")

The Pitfall of .exists()

Using .exists() alone is insufficient if your code relies on the path being a folder.

from pathlib import Path

path_to_file = Path("report.txt")

if path_to_file.exists():
    print("Path exists (but might crash if treated as a folder).")

if path_to_file.is_dir():
    print("This will not print.")

Method 2: Using os.path (Legacy)

If you are maintaining older codebases or prefer the procedural style, the os module provides similar functionality.

Using os.path.isdir()

Like pathlib, os.path.isdir() checks both existence and type.

import os

path = "data_backup"

if os.path.isdir(path):
    print(f"Directory '{path}' found.")
else:
    print(f"Directory '{path}' not found.")

Handling Permissions and Race Conditions

Checking for existence is often a precursor to performing an action (like creating a file or reading a directory). In these cases, simply checking if exists: is not enough due to Race Conditions (the state might change between the check and the action) or Permissions.

The "Easier to Ask Forgiveness than Permission" (EAFP) Principle

Instead of checking if a directory exists before creating it, it is often safer to try creating it and handle the error if it already exists.

import os

path = "new_secure_folder"

try:
    os.makedirs(path, exist_ok=False)
    print("Directory created successfully.")

except FileExistsError:
    print("Directory already exists.")

except PermissionError:
    print("Error: You do not have permission to create this directory.")

except OSError as e:
    print(f"System error occurred: {e}")

Checking Read Permissions

If you need to verify you can actually read the directory, use os.access.

import os

path = "/root/secret_folder" # Example protected path

if os.path.isdir(path):
    if os.access(path, os.R_OK):
        print("Directory exists and is readable.")
    else:
        print("Directory exists, but READ permission is denied.")
else:
    print("Directory does not exist.")

Conclusion

To check directory existence safely in Python:

  1. Prefer pathlib.Path.is_dir() for modern, readable code.
  2. Use os.path.isdir() for legacy scripts.
  3. Avoid exists() unless you truly don't care if the target is a file or a directory.
  4. Use try...except blocks when performing operations to handle permissions and race conditions gracefully.
Navigation