How to check the permissions of a directory using Python?

When working with files and directories in Python, checking permissions is essential to determine what operations can be performed. The os module provides convenient functions to check directory permissions. This article explores different methods to accomplish this task using practical code examples.

Before we begin, ensure you have a basic understanding of Python and have Python installed on your system.

Using os.access() Function

The os.access() function is the most straightforward way to check directory permissions. It returns True if the specified permission is granted, False otherwise.

Basic Permission Check

Here's how to check individual permissions for a directory ?

import os

def check_directory_permissions(directory_path):
    if os.access(directory_path, os.R_OK):
        print(f"Read permissions are granted for: {directory_path}")
    else:
        print(f"Read permissions are NOT granted for: {directory_path}")
    
    if os.access(directory_path, os.W_OK):
        print(f"Write permissions are granted for: {directory_path}")
    else:
        print(f"Write permissions are NOT granted for: {directory_path}")
    
    if os.access(directory_path, os.X_OK):
        print(f"Execute permissions are granted for: {directory_path}")
    else:
        print(f"Execute permissions are NOT granted for: {directory_path}")

# Test with current directory
directory_path = "."
check_directory_permissions(directory_path)
Read permissions are granted for: .
Write permissions are granted for: .
Execute permissions are granted for: .

Combined Permission Check

You can check multiple permissions at once using bitwise OR operator ?

import os

def check_all_permissions(directory_path):
    if os.access(directory_path, os.R_OK | os.W_OK | os.X_OK):
        print(f"All permissions (read, write, execute) are granted for: {directory_path}")
    else:
        print(f"Not all permissions are granted for: {directory_path}")

# Test with current directory
directory_path = "."
check_all_permissions(directory_path)
All permissions (read, write, execute) are granted for: .

Using os.stat() Function

The os.stat() function provides detailed file system information, including permissions as octal values. This method gives you more control over permission checking.

import os
import stat

def check_permissions_with_stat(directory_path):
    try:
        permissions = os.stat(directory_path).st_mode
        print(f"Permissions for directory: {directory_path}")
        print(f"Read permission: {'Yes' if permissions & stat.S_IRUSR else 'No'}")
        print(f"Write permission: {'Yes' if permissions & stat.S_IWUSR else 'No'}")
        print(f"Execute permission: {'Yes' if permissions & stat.S_IXUSR else 'No'}")
        
        # Display octal representation
        octal_perms = oct(permissions)[-3:]
        print(f"Octal permissions: {octal_perms}")
        
    except FileNotFoundError:
        print(f"Directory not found: {directory_path}")
    except PermissionError:
        print(f"Permission denied to access: {directory_path}")

# Test with current directory
directory_path = "."
check_permissions_with_stat(directory_path)
Permissions for directory: .
Read permission: Yes
Write permission: Yes
Execute permission: Yes
Octal permissions: 755

Complete Permission Checker Function

Here's a comprehensive function that combines both methods with proper error handling ?

import os
import stat

def comprehensive_permission_check(directory_path):
    try:
        # Check if path exists and is a directory
        if not os.path.exists(directory_path):
            print(f"Path does not exist: {directory_path}")
            return
        
        if not os.path.isdir(directory_path):
            print(f"Path is not a directory: {directory_path}")
            return
        
        print(f"Checking permissions for: {directory_path}")
        print("-" * 50)
        
        # Method 1: Using os.access()
        print("Using os.access():")
        readable = os.access(directory_path, os.R_OK)
        writable = os.access(directory_path, os.W_OK)
        executable = os.access(directory_path, os.X_OK)
        
        print(f"  Read: {readable}")
        print(f"  Write: {writable}")
        print(f"  Execute: {executable}")
        
        # Method 2: Using os.stat()
        permissions = os.stat(directory_path).st_mode
        octal_perms = oct(permissions)[-3:]
        print(f"\nUsing os.stat():")
        print(f"  Octal permissions: {octal_perms}")
        print(f"  Binary representation: {bin(permissions)}")
        
    except PermissionError:
        print(f"Permission denied to access: {directory_path}")
    except Exception as e:
        print(f"Error: {e}")

# Test the function
comprehensive_permission_check(".")
Checking permissions for: .
--------------------------------------------------
Using os.access():
  Read: True
  Write: True
  Execute: True

Using os.stat():
  Octal permissions: 755
  Binary representation: 0b100000000101101101

Comparison

Method Advantages Best For
os.access() Simple, direct boolean results Quick permission checks
os.stat() Detailed information, octal values Advanced permission analysis

Conclusion

Use os.access() for simple permission checks and os.stat() for detailed permission analysis. Always include proper error handling when checking directory permissions to handle cases where directories don't exist or access is denied.

Updated on: 2026-03-24T17:24:34+05:30

12K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements