pathlib & Modern File Handling
Also Known As
pathlib
Path
os.path replacement
filesystem Python
TL;DR
pathlib.Path provides an object-oriented API for filesystem operations — replacing os.path string manipulation with readable, chainable, and cross-platform path handling.
Explanation
pathlib (Python 3.4+) represents paths as Path objects with methods: / operator joins paths, .read_text() / .write_text() / .read_bytes(), .exists() / .is_file() / .is_dir(), .glob() / .rglob() for pattern matching, .stem / .suffix / .parent / .name attributes, .mkdir(parents=True, exist_ok=True). Avoids the fragile string concatenation of os.path.join(). Works correctly on Windows (backslash) and Unix (forward slash). Use Path objects from the start — do not mix Path and string manipulation.
Common Misconception
✗ os.path is equivalent to pathlib — os.path uses string manipulation and requires knowing the right function for each operation; pathlib provides an intuitive object model that reads like natural language.
Why It Matters
os.path.join(base, 'sub', 'file.txt') is verbose and error-prone — Path(base) / 'sub' / 'file.txt' is readable, cross-platform, and provides richer functionality.
Common Mistakes
- Mixing string concatenation with Path objects — always use / operator or Path() constructor.
- Not using exist_ok=True in mkdir — raises if directory exists.
- glob() not being recursive — use rglob('**/*.py') or rglob with a pattern for recursive matching.
- Converting Path to string with str() when passing to legacy APIs — unnecessary in modern Python.
Code Examples
✗ Vulnerable
import os
# String-based path manipulation — fragile:
base = '/var/www/app'
config_path = base + '/config' + '/settings.json' # Wrong on Windows
if os.path.exists(config_path):
with open(config_path) as f:
data = f.read()
os.makedirs(os.path.join(base, 'logs'), exist_ok=True)
✓ Fixed
from pathlib import Path
base = Path('/var/www/app')
config_path = base / 'config' / 'settings.json' # / operator, cross-platform
if config_path.exists():
data = config_path.read_text(encoding='utf-8') # No with-open needed
(base / 'logs').mkdir(parents=True, exist_ok=True)
# Find all Python files recursively:
for py_file in base.rglob('*.py'):
print(py_file.stem, py_file.suffix)
Tags
🤝 Adopt this term
£79/year · your link shown here
Added
16 Mar 2026
Edited
22 Mar 2026
Views
19
🤖 AI Guestbook educational data only
|
|
Last 30 days
Agents 0
No pings yet today
No pings yesterday
Amazonbot 6
Perplexity 4
Ahrefs 2
Unknown AI 2
Google 1
Also referenced
How they use it
crawler 15
Related categories
⚡
DEV INTEL
Tools & Severity
🟢 Low
⚙ Fix effort: Low
⚡ Quick Fix
Use pathlib.Path instead of os.path for all file operations — Path('/etc') / 'hosts' is cleaner than os.path.join('/etc', 'hosts'), and Path methods are object-oriented and expressive
📦 Applies To
python 3.4
web
cli
🔗 Prerequisites
🔍 Detection Hints
os.path.join() still used when pathlib available; string concatenation for file paths; open(filename) with string path instead of Path object
Auto-detectable:
✓ Yes
ruff
pylint
⚠ Related Problems
🤖 AI Agent
Confidence: Low
False Positives: Medium
✓ Auto-fixable
Fix: Low
Context: File