Skip to content

PATH COMPONENTS - split, dirname, basename, splitext

Python
#!/usr/bin/env python3
"""
PATH COMPONENTS - split, dirname, basename, splitext
Demonstrates parsing path components
"""

import os

print("=" * 60)
print("PATH COMPONENTS - Parsing Paths")
print("=" * 60)

sample_paths = [
    "/home/user/documents/file.txt",
    "relative/path/to/script.py",
    "C:\\Windows\\System32\\notepad.exe",
    "/usr/local/bin/python3",
    "data.csv",
    "/path/to/archive.tar.gz"
]

# Example 1: os.path.basename()
print("\n1. os.path.basename() - Get Filename")
print("-" * 40)
for path in sample_paths[:4]:
    basename = os.path.basename(path)
    print(f"  {path}")
    print(f"    -> {basename}")

# Example 2: os.path.dirname()
print("\n2. os.path.dirname() - Get Directory")
print("-" * 40)
for path in sample_paths[:4]:
    dirname = os.path.dirname(path)
    print(f"  {path}")
    print(f"    -> {dirname or '(empty)'}")

# Example 3: os.path.split()
print("\n3. os.path.split() - Split into Dir and File")
print("-" * 40)
for path in sample_paths[:4]:
    head, tail = os.path.split(path)
    print(f"  {path}")
    print(f"    head: {head or '(empty)'}")
    print(f"    tail: {tail}")

# Example 4: os.path.splitext()
print("\n4. os.path.splitext() - Split Extension")
print("-" * 40)
for path in [sample_paths[0], sample_paths[1], sample_paths[4], sample_paths[5]]:
    name, ext = os.path.splitext(path)
    print(f"  {os.path.basename(path)}")
    print(f"    name: {os.path.basename(name)}")
    print(f"    ext:  {ext}")

# Example 5: splitdrive()
print("\n5. os.path.splitdrive() - Split Drive Letter")
print("-" * 40)
paths_with_drive = [
    "C:\\Users\\file.txt",
    "/home/user/file.txt",
    "file.txt"
]
for path in paths_with_drive:
    drive, tail = os.path.splitdrive(path)
    print(f"  {path}")
    print(f"    drive: '{drive or '(none)'}'")
    print(f"    path:  {tail}")

# Example 6: Get filename without extension
print("\n6. Get Filename Without Extension")
print("-" * 40)
paths = ["document.pdf", "script.py", "archive.tar.gz"]
for path in paths:
    name_no_ext = os.path.splitext(os.path.basename(path))[0]
    print(f"  {path} -> {name_no_ext}")

# Example 7: Get extension only
print("\n7. Get File Extension")
print("-" * 40)
for path in paths:
    ext = os.path.splitext(path)[1]
    print(f"  {path} -> '{ext}'")

# Example 8: Change extension
print("\n8. Change File Extension")
print("-" * 40)
original = "document.txt"
name, _ = os.path.splitext(original)
new_file = name + ".pdf"
print(f"  Original: {original}")
print(f"  Changed:  {new_file}")

# Example 9: Get all path components
print("\n9. Get All Path Components")
print("-" * 40)
path = "/home/user/documents/project/file.txt"
components = []
while True:
    path, tail = os.path.split(path)
    if tail:
        components.insert(0, tail)
    else:
        if path:
            components.insert(0, path)
        break
print(f"  Path: /home/user/documents/project/file.txt")
print(f"  Components: {components}")

# Example 10: Reconstruct path from components
print("\n10. Parse and Reconstruct Path")
print("-" * 40)
original_path = "/home/user/docs/file.txt"
directory = os.path.dirname(original_path)
filename = os.path.basename(original_path)
name, ext = os.path.splitext(filename)

print(f"  Original: {original_path}")
print(f"  Directory: {directory}")
print(f"  Filename: {filename}")
print(f"  Name: {name}")
print(f"  Extension: {ext}")

reconstructed = os.path.join(directory, name + ext)
print(f"  Reconstructed: {reconstructed}")
print(f"  Match: {original_path == reconstructed}")

print("\n" + "=" * 60)
print("Key Points:")
print("  - basename() gets filename")
print("  - dirname() gets directory")
print("  - split() splits into (dir, file)")
print("  - splitext() splits into (name, extension)")
print("  - Platform-aware parsing")
print("=" * 60)