Skip to content

CREATING DIRECTORIES - Using os.mkdir() and os.makedirs()

Python
#!/usr/bin/env python3
"""
CREATING DIRECTORIES - Using os.mkdir() and os.makedirs()
Demonstrates directory creation with various options
"""

import os
import tempfile

print("=" * 60)
print("CREATING DIRECTORIES - os.mkdir() and os.makedirs()")
print("=" * 60)

temp_dir = tempfile.gettempdir()
base_dir = os.path.join(temp_dir, "mkdir_demo")

# Clean up if exists
import shutil
if os.path.exists(base_dir):
    shutil.rmtree(base_dir)

os.makedirs(base_dir)
print(f"Created base directory: {base_dir}\n")

# Example 1: Basic os.mkdir()
print("1. Basic os.mkdir() - Single Directory")
print("-" * 40)
dir1 = os.path.join(base_dir, "simple_dir")
os.mkdir(dir1)
print(f"  Created: {dir1}")
print(f"  Exists: {os.path.exists(dir1)}")
print(f"  Is directory: {os.path.isdir(dir1)}")

# Example 2: Create with specific permissions
print("\n2. Create with Permissions (mode)")
print("-" * 40)
dir2 = os.path.join(base_dir, "perms_dir")
os.mkdir(dir2, mode=0o755)  # rwxr-xr-x
print(f"  Created: {dir2}")
stat_info = os.stat(dir2)
print(f"  Mode: {oct(stat_info.st_mode)}")

# Example 3: os.makedirs() - Create parent directories
print("\n3. os.makedirs() - Create Parent Directories")
print("-" * 40)
nested_dir = os.path.join(base_dir, "parent", "child", "grandchild")
os.makedirs(nested_dir)
print(f"  Created nested path: {nested_dir}")
print("  Created intermediate directories:")
print(f"    - parent/")
print(f"    - parent/child/")
print(f"    - parent/child/grandchild/")

# Example 4: makedirs with exist_ok
print("\n4. makedirs() with exist_ok=True")
print("-" * 40)
existing_dir = os.path.join(base_dir, "existing")
os.makedirs(existing_dir)
print(f"  Created: {existing_dir}")

# Try to create again
try:
    os.makedirs(existing_dir)
    print("  ERROR: Should have raised FileExistsError")
except FileExistsError:
    print("  Without exist_ok: FileExistsError raised")

# With exist_ok=True
os.makedirs(existing_dir, exist_ok=True)
print("  With exist_ok=True: No error")

# Example 5: Create multiple directories
print("\n5. Create Multiple Directories")
print("-" * 40)
dir_names = ["logs", "data", "config", "temp"]
for dirname in dir_names:
    dir_path = os.path.join(base_dir, dirname)
    os.mkdir(dir_path)
    print(f"  Created: {dirname}/")

# Example 6: Create directory structure
print("\n6. Create Complex Directory Structure")
print("-" * 40)
structure = [
    "project/src",
    "project/tests",
    "project/docs",
    "project/bin"
]

for path in structure:
    full_path = os.path.join(base_dir, path)
    os.makedirs(full_path, exist_ok=True)
    print(f"  Created: {path}/")

# Example 7: Error handling
print("\n7. Error Handling")
print("-" * 40)

# Try to create where file exists
file_path = os.path.join(base_dir, "not_a_dir.txt")
with open(file_path, 'w') as f:
    f.write("test")

try:
    os.mkdir(file_path)
except FileExistsError:
    print("  Cannot create directory: file exists with same name")

# Try to create in non-existent parent
try:
    os.mkdir(os.path.join(base_dir, "nonexistent", "child"))
except FileNotFoundError:
    print("  os.mkdir() fails if parent doesn't exist")

# Example 8: Verify creation
print("\n8. Verify Directory Creation")
print("-" * 40)
verify_dir = os.path.join(base_dir, "verify_me")

print(f"  Before: exists = {os.path.exists(verify_dir)}")
os.mkdir(verify_dir)
print(f"  After:  exists = {os.path.exists(verify_dir)}")
print(f"  Is directory: {os.path.isdir(verify_dir)}")
print(f"  Is file: {os.path.isfile(verify_dir)}")

# Example 9: Create dated directories
print("\n9. Create Dated Directories")
print("-" * 40)
from datetime import datetime

backup_base = os.path.join(base_dir, "backups")
os.makedirs(backup_base, exist_ok=True)

dates = ["2024-01-01", "2024-01-02", "2024-01-03"]
for date in dates:
    date_dir = os.path.join(backup_base, date)
    os.mkdir(date_dir)
    print(f"  Created: backups/{date}/")

# Example 10: Create user directory structure
print("\n10. Create User Home Directory Structure")
print("-" * 40)
user_dir = os.path.join(base_dir, "user_home")
user_subdirs = [
    "Documents",
    "Downloads",
    "Pictures",
    "Videos",
    "Music",
    ".config"
]

os.makedirs(user_dir, exist_ok=True)
for subdir in user_subdirs:
    os.mkdir(os.path.join(user_dir, subdir))
    print(f"  Created: user_home/{subdir}/")

# Example 11: List all created directories
print("\n11. Show Full Directory Tree")
print("-" * 40)

def print_tree(directory, prefix="", max_depth=3, current_depth=0):
    """Print directory tree"""
    if current_depth >= max_depth:
        return

    try:
        items = sorted(os.listdir(directory))
        dirs = [item for item in items if os.path.isdir(os.path.join(directory, item))]

        for i, dirname in enumerate(dirs):
            is_last = i == len(dirs) - 1
            print(f"{prefix}{'└── ' if is_last else '├── '}{dirname}/")

            new_prefix = prefix + ("    " if is_last else "│   ")
            print_tree(os.path.join(directory, dirname), new_prefix, max_depth, current_depth + 1)
    except PermissionError:
        pass

print(f"  {os.path.basename(base_dir)}/")
print_tree(base_dir, "  ", max_depth=2)

# Cleanup
shutil.rmtree(base_dir)

print("\n" + "=" * 60)
print("Key Points:")
print("  - os.mkdir() creates single directory")
print("  - os.makedirs() creates parent directories")
print("  - Use exist_ok=True to avoid errors")
print("  - Set permissions with mode parameter")
print("  - Parent directory must exist for mkdir()")
print("=" * 60)