Examples
Practical examples of using pathlib3.
Basic File Operations
from pathlib3 import Path
# Create a file with parent directories
p = Path("/tmp/new/folder/file.txt")
p.touch_parent()
# Get file information
print(f"Extension: {p.ext()}")
print(f"Size: {p.size_human()}")
print(f"Age: {p.age()} seconds")
# Copy and backup
p.copy_to("/backup/file.txt")
p.backup() # Creates file.txt.bak
Working with JSON
from pathlib3 import Path
# Write JSON
config = {"host": "localhost", "port": 8080}
Path("config.json").write_json(config)
# Read JSON
config = Path("config.json").read_json()
print(config["host"])
# Update and save
config["port"] = 9090
Path("config.json").write_json(config, indent=4)
Directory Tree Operations
from pathlib3 import Path
# Create nested structure
base = Path("/tmp/project")
base.ensure_dir()
(base / "src").ensure_dir()
(base / "src" / "main.py").touch()
(base / "src" / "utils.py").touch()
(base / "tests").ensure_dir()
(base / "README.md").touch()
# Display tree
print(base.tree(max_depth=2))
# Find all Python files
py_files = base.find_files("*.py")
for f in py_files:
print(f"Found: {f}")
File Management
from pathlib3 import Path
# Organize files by extension
source_dir = Path("/downloads")
for file in source_dir.ls(only_files=True):
ext = file.ext()
if ext:
dest_dir = Path(f"/organized/{ext}")
dest_dir.ensure_dir()
file.move_to(dest_dir / file.name)
Log File Processing
from pathlib3 import Path
# Process log files
log_file = Path("/var/log/app.log")
# Get file info
print(f"Log size: {log_file.size_human()}")
print(f"Lines: {log_file.count_lines()}")
# Append new log entry
log_file.append_text("[INFO] Application started\n")
# Backup old logs
if log_file.size() > 10_000_000: # 10 MB
backup = log_file.backup(f".{log_file.mtime()}")
log_file.write_text("") # Clear log
File Comparison and Verification
from pathlib3 import Path
# Compare files
file1 = Path("original.txt")
file2 = Path("copy.txt")
if file1.same_content(file2):
print("Files are identical")
# Verify file integrity
checksum = Path("download.zip").hash("sha256")
print(f"SHA256: {checksum}")
# Compare with expected
expected = "abc123..."
if checksum == expected:
print("File verified!")
Batch Operations
from pathlib3 import Path
# Process all text files
docs_dir = Path("/documents")
for txt_file in docs_dir.find_files("*.txt"):
# Create backup
txt_file.backup()
# Convert to markdown
lines = txt_file.lines()
md_file = txt_file.change_ext("md")
md_file.write_text("\n".join(lines))
print(f"Converted: {txt_file.basename()} -> {md_file.basename()}")
Method Chaining
from pathlib3 import Path
# Chain multiple operations
result = (Path("/tmp/data.json")
.ensure_parent()
.write_json({"status": "ok"})
.copy_to("/backup/data.json")
.hash())
print(f"Checksum: {result}")
# Complex workflow
(Path("/reports/2024/")
.ensure_dir()
.join("summary.txt")
.touch()
.append_text("Report Summary\n")
.append_text("=" * 50 + "\n"))
Cleanup Operations
from pathlib3 import Path
import time
# Clean old cache files
cache_dir = Path("/tmp/cache")
max_age = 86400 # 1 day in seconds
for file in cache_dir.find_files():
if file.age() > max_age:
print(f"Removing old file: {file.basename()}")
file.rm()
# Clean empty directories
for dir_path in cache_dir.find_dirs():
if dir_path.is_empty():
print(f"Removing empty dir: {dir_path}")
dir_path.rm()
Data Processing
from pathlib3 import Path
# Process CSV data
data_file = Path("data.csv")
lines = data_file.lines()
# Process each line
results = []
for line in lines[1:]: # Skip header
# ... process line ...
results.append(processed)
# Save results as JSON
output = Path("results.json")
output.write_json(results, indent=2)
# Create summary
summary = Path("summary.txt")
summary.write_text(f"Processed {len(results)} records\n")
summary.append_text(f"Output: {output.abspath()}\n")
summary.append_text(f"Size: {output.size_human()}\n")
Music tag info
from pathlib3 import Path
music_file = Path("/mnt/musics/album/file.mp3")
music_file.music_tag() # return dict
music_file.show_info() # print music tag info
music_dir = Path("/mnt/musics/album")
music_dir.music_tag() # return list of dict
music_dir.music_tag(exts=['mp4','m4a']) # return list of dict for specified extensions
music_dir.show_info() # print music tag info for all music files
music_dir.show_info(exts=['mp4','m4a']) # print music tag info for specified extensions
Validate File Integrity
from pathlib3 import Path, YAML_AVAILABLE, TOML_AVAILABLE
# Check available libraries
print(f"YAML support: {YAML_AVAILABLE}")
print(f"TOML support: {TOML_AVAILABLE}")
# Validate JSON (always works)
is_valid, error = Path("config.json").validate()
if is_valid:
print("Valid JSON!")
else:
print(f"Invalid: {error}")
# Validate YAML (needs PyYAML)
is_valid, error = Path("config.yaml").validate(strict=False)
if not is_valid:
print(f"Error: {error}")
# Auto-detect from extension
Path("settings.toml").validate() # Auto-detects TOML
# Manual file type
Path("data.txt").validate(file_type='json') # Force JSON validation
Handling None Values
pathlib3 safely handles None values:
from pathlib3 import Path
# Path(None) returns current directory
p = Path(None) # Path('.')
other_dir = None # if some variable is None
p = Path(other_dir, "my_dir") # Path('my_dir')
# Use safe() for explicit None handling
p = Path.safe(None) # Path('.')
p = Path.safe(None, '/tmp') # Path('/tmp')
# Use from_optional() to preserve None
p = Path.from_optional(None) # None
p = Path.from_optional("file.txt") # Path('file.txt')
# with multiple args
b = Path(None, "subdir") # Path('subdir')
print(b) # subdir
# Normal usage still works
g = Path("normal.txt")
print(g) # normal.txt
Get Metadata
from pathlib3 import Path, PIL_AVAILABLE, PYPDF2_AVAILABLE
# Check available libraries
print(f"Image support: {PIL_AVAILABLE}")
print(f"PDF support: {PYPDF2_AVAILABLE}")
# Get image metadata
meta = Path("photo.jpg").metadata()
print(meta['width'], meta['height'])
print(meta['exif']['camera_make'])
# Get PDF metadata
meta = Path("document.pdf").metadata()
print(f"Pages: {meta['pages']}")
print(f"Author: {meta['author']}")
# Get audio metadata
meta = Path("song.mp3").metadata()
print(f"Artist: {meta['artist']}")
print(f"Duration: {meta['length_human']}")
# Simple summary
print(Path("photo.jpg").metadata_simple())
# Raw metadata
meta = Path("photo.jpg").metadata(raw=True)
print(meta['exif_raw']) # All EXIF data
Send as Email Attachment
from pathlib3 import Path, EmailConfig
# Setup email config (Gmail example)
config = EmailConfig.gmail(
username='your.email@gmail.com',
password='your_app_password' # Get from: https://myaccount.google.com/apppasswords
)
# Send single file
Path('report.pdf').email_as_attachment(
to='boss@company.com',
subject='Monthly Report',
body='Please find the monthly report attached.',
config=config
)
# Send to multiple people
Path('invoice.pdf').email_as_attachment(
to=['client@company.com', 'manager@company.com'],
subject='Invoice #12345',
body='Your invoice is attached.',
cc='accounting@company.com',
bcc='archive@company.com',
config=config
)
html_body = """
<html>
<body>
<h2>Monthly Report</h2>
<p>Dear Boss,</p>
<p>Please find the <strong>monthly report</strong> attached.</p>
<p>Best regards,<br>Your Name</p>
</body>
</html>
"""
Path('report.pdf').email_as_attachment(
to='boss@company.com',
subject='Monthly Report',
body='Plain text version',
body_html=html_body,
config=config
)
# Send email with multiple files
Path.send_email(
to='client@company.com',
subject='Project Deliverables',
body='Please find all project files attached.',
config=config,
attachments=[
'report.pdf',
'presentation.pptx',
'data.xlsx',
Path('images/chart.png')
]
)
# Gmail
config_gmail = EmailConfig.gmail('user@gmail.com', 'app_password')
# Outlook/Hotmail
config_outlook = EmailConfig.outlook('user@outlook.com', 'password')
# Office 365
config_o365 = EmailConfig.office365('user@company.com', 'password')
# Yahoo
config_yahoo = EmailConfig.yahoo('user@yahoo.com', 'password')
# Custom SMTP server
config_custom = EmailConfig(
smtp_server='mail.mycompany.com',
smtp_port=587,
username='user@mycompany.com',
password='password',
use_tls=True
)
html_with_image = """
<html>
<body>
<h2>Check out this chart:</h2>
<img src="cid:chart.png" alt="Sales Chart">
</body>
</html>
"""
Path('chart.png').email_as_attachment(
to='team@company.com',
subject='Sales Chart',
body_html=html_with_image,
config=config,
inline_images=True
)
try:
Path('report.pdf').email_as_attachment(
to='boss@company.com',
subject='Report',
body='Attached.',
config=config
)
print("Email sent successfully!")
except ConnectionError as e:
print(f"Failed to send: {e}")
except ValueError as e:
print(f"Invalid input: {e}")
Image Manipulation
Perform basic image operations:
from pathlib3 import Path
# Multiple ICO files (one per size)
Path('logo.png').to_ico()
# Creates: logo_16.ico, logo_32.ico, logo_48.ico, ...
# Single multi-size ICO (Windows style)
Path('app.png').to_ico(multi_size=True)
# Creates: app.ico (contains all sizes)
# Custom sizes
Path('icon.png').to_ico(
sizes=[16, 32, 64, 128],
multi_size=True
)
# Favicon for website
Path('logo.png').to_ico(
sizes=[16, 32, 48],
output_path='favicon.ico',
multi_size=True
)
# Resize to width (auto height)
Path('photo.jpg').resize(width=1920)
# Resize to fit in 1024x1024
Path('image.png').resize(max_size=1024)
# Exact dimensions (may distort)
Path('banner.jpg').resize(
width=1200,
height=400,
keep_aspect=False
)
# Create thumbnail
Path('photo.jpg').resize(
max_size=300,
output_path='thumb.jpg',
quality=85
)
# Quick thumbnail
Path('photo.jpg').thumbnail() # photo_thumb.jpg (256px max)
# Small square thumbnail
Path('image.png').thumbnail(size=128, square=True)
# Custom output
Path('photo.jpg').thumbnail(
size=200,
output_path='thumbnails/photo_small.jpg'
)
# PNG to JPEG
Path('transparent.png').convert_format('jpg')
# JPEG to WebP (smaller file size)
Path('photo.jpg').convert_format('webp', quality=80)
# Any to PNG (lossless)
Path('image.bmp').convert_format('png')
# JPEG to PNG (preserve transparency)
Path('logo.jpg').convert_format('png')
# Batch resize
for img in Path('photos').find_files('*.jpg'):
img.resize(max_size=1920, output_path=f'resized/{img.name}')
# Create thumbnails for all images
for img in Path('.').find_files('*.png'):
img.thumbnail(size=256)
# Convert all PNG to WebP
for png in Path('images').find_files('*.png'):
png.convert_format('webp', quality=85)