Rediscovering Python's Pathlib
From Type Hint to Power Tool: Python’s Pathlib
For a long time, I used Path from Python’s pathlib module purely as a type hint - a way to make function signatures look more modern and semantically clear. Like this:
from pathlib import Path
def process_file(file_path: Path):
...It changed when I started building an application that handled user-uploaded documents. I had to create temporary folders, write intermediate files, manage output paths, and ensure directories existed before saving results. That’s when Path went from just a type hint to a core part of my file management logic.
Why pathlib is Worth More than a Hint
Here are the use cases where it transformed my workflow:
Ensuring Directories Exist
Before:
import os
if not os.path.exists("output"):
os.makedirs("output")Now:
from pathlib import Path
Path("output").mkdir(parents=True, exist_ok=True)parents=True: Creates any missing parent directories.exist_ok=True: Prevents an error if the directory already exists. This is equivalent to os.makedirs(), but more cleaner and readable!
Managing Directories
While handling temporary files for a file-processing API, I needed to:
- Create a temp folder
- Ensure it exists
- Write intermediate files
- Clean up afterward
With Path, this became natural and structured:
from pathlib import Path
temp_dir = Path("/tmp/myapp") / "job123"
temp_dir.mkdir(parents=True, exist_ok=True)
output_file = temp_dir / "translated.txt"
output_file.write_text("Translated content")
content = output_file.read_text()write_text(data: str): Writes a string to a text file (overwrites if it exists).read_text(): Reads file content and returns a string.
To cleanup the (temporary) directories:
# Cleanup later if needed
output_file.unlink()
temp_dir.rmdir()unlink: Deletes a filermdir: Removes an empty directory
You can use unlink with a parameter missing_ok:
Without missing_ok=True: raisesFileNotFoundErrorif the file doesn’t exist.With missing_ok=True: silently does nothing if the file is already gone.
You can also check path status to avoid runtime errors:
p = Path("result.txt")
p.exists() # True if file or directory exists
p.is_file() # True if it's a regular file
p.is_dir() # True if it's a directoryTo list directory contents:
p = Path("my_folder")
for item in p.iterdir():
print(item)Path Arithmetic
Joining paths becomes expressive with /:
base = Path("/data")
file = base / "user" / "output.txt"Compared to:
file = os.path.join("/data", "user", "output.txt")You can also extract name, stem, suffix (file extension) and so on:
p = Path("/home/user/project/file.txt")
p.name # 'file.txt'
p.stem # 'file'
p.suffix # '.txt'
p.parent # PosixPath('/home/user/project')
p.parts # ('/', 'home', 'user', 'project', 'file.txt')