
Привет! Если вы пишете на Python уже некоторое время, то наверняка использовали модули os и shutil. Они работают, но их синтаксис часто выглядит громоздким и «строковым». Для современного Python есть куда более элегантное решение — встроенная библиотека Pathlib.
Pathlib позволяет работать с путями, как с полноценными объектами, используя интуитивно понятные методы и операторы, что значительно повышает читаемость и безопасность вашего кода. Забудьте о бесконечных os.path.join() и сложном управлении строками!
В этой статье мы подробно рассмотрим 12 хитрых и практичных python pathlib примеров, которые позволят вам навсегда перейти на объектно-ориентированную работу с файловой системой. Готовы упростить свой код и сэкономить время? Поехали!
Оглавление
🚀 Pathlib VS os.path: Почему стоит переключиться?
Главное отличие pathlib в том, что вместо передачи строк в функции (os.path.join(dir, file)), вы создаете объект пути. Этот объект обладает методами, которые сами знают, как работать с операционной системой, будь то Windows, Linux или macOS.
Улучшение 1: Объединение путей через слэш (/)
В os.path для объединения частей пути приходилось использовать join(), чтобы гарантировать правильное добавление разделителей (/ или \). Pathlib позволяет использовать оператор /, как если бы вы работали со строками, но делает это безопасно.
Синхронный подход (os.path):
import os
path = os.path.join("документы", "отчеты", "файл.txt")
# 'документы/отчеты/файл.txt'
Объектный подход (pathlib):
from pathlib import Path
BASE_DIR = Path("документы")
filepath = BASE_DIR / "отчеты" / "файл.txt"
print(filepath)
# документы/отчеты/файл.txt
Pathlib автоматически использует правильный разделитель (слэш) независимо от операционной системы, что делает код кросс-платформенным по умолчанию.
📚 Документация: Pathlib
⚙️ 12 практичных Python Pathlib примеров
1. Создание пути к текущему файлу
Это основа любой работы с путями: получение абсолютного пути к скрипту, который выполняется.
from pathlib import Path
# Получаем объект пути к текущему скрипту
current_file_path = Path(__file__).resolve()
print(f"Путь к файлу: {current_file_path}")
2. Создание каталогов (с рекурсией)
Функция mkdir() позволяет безопасно создавать каталоги, включая все промежуточные (как os.makedirs), и при этом избежать ошибки, если каталог уже существует.
from pathlib import Path
new_dir = Path("проекты/временные/тест")
# Создает "проекты", "временные", "тест"
# exists_ok=True предотвратит ошибку, если каталог "проекты" уже существует
new_dir.mkdir(parents=True, exist_ok=True)
print(f"Каталог создан: {new_dir.exists()}") # True
3. Разложение пути на части
Pathlib позволяет легко извлекать различные компоненты пути — имя файла, расширение, имя родительской папки — с помощью атрибутов, а не сложных строковых операций.
from pathlib import Path
filepath = Path("/home/user/документы/отчет.pdf")
print(f"Полное имя файла (stem + suffix): {filepath.name}") # отчет.pdf
print(f"Имя файла без расширения (stem): {filepath.stem}") # отчет
print(f"Расширение (suffix): {filepath.suffix}") # .pdf
print(f"Родительский каталог (parent): {filepath.parent.name}") # документы
4. Фильтрация файлов по расширению
Для поиска файлов по определенному шаблону или расширению используется метод glob().
from pathlib import Path
# Предположим, что WORK_DIR — это папка с файлами
WORK_DIR = Path('.') # Текущий каталог
# Ищем все файлы с расширением .txt
text_files = list(WORK_DIR.glob('*.txt'))
print(f"Найдено TXT-файлов: {len(text_files)}")
for file in text_files:
print(file.name)
5. Рекурсивный обход каталогов
Если нужно искать файлы не только в текущем каталоге, но и во всех подкаталогах (аналогично os.walk), используйте glob() с шаблоном **/*.
from pathlib import Path
BASE_DIR = Path('./проекты')
# Находит все файлы .py во всех подпапках
all_py_files = list(BASE_DIR.glob('**/*.py'))
for file in all_py_files:
print(file.relative_to(BASE_DIR)) # Показывает путь относительно BASE_DIR
6. Быстрая проверка существования и типа
Pathlib предоставляет простые булевы методы для проверки, является ли путь файлом, каталогом или существует ли он вообще.
from pathlib import Path
file = Path("файл.txt")
directory = Path("проекты")
if file.exists(): # Проверяет существование
if file.is_file():
print(f"{file.name} - это файл.")
if directory.is_dir():
print(f"{directory.name} - это каталог.")
7. Получение и изменение метаданных
Вместо os.stat() Pathlib предоставляет удобные обертки для получения метаданных, таких как размер файла или время последнего изменения.
from pathlib import Path
import datetime
filepath = Path("файл.txt") # Должен существовать
if filepath.exists():
size_bytes = filepath.stat().st_size
# Время последнего изменения в формате datetime
mod_time = datetime.datetime.fromtimestamp(filepath.stat().st_mtime)
print(f"Размер: {size_bytes} байт")
print(f"Изменен: {mod_time.strftime('%Y-%m-%d %H:%M:%S')}")
8. Чтение и запись файлов (В Python 3.5+)
Pathlib включает два очень удобных метода: read_text() и write_text(), которые полностью заменяют рутинное открытие, чтение и закрытие файла с помощью open().
from pathlib import Path
data = "Привет, Pathlib!"
new_file = Path("привет.txt")
# Запись текста
new_file.write_text(data, encoding='utf-8')
print("Файл записан.")
# Чтение текста
content = new_file.read_text(encoding='utf-8')
print(f"Прочитано: {content}")
9. Переименование файла
Для переименования файла или каталога используйте метод rename(). Это атомарная операция, которая гарантирует безопасность, если вы переносите файл в рамках одной файловой системы.
from pathlib import Path
old_name = Path("привет.txt")
new_name = Path("сообщение.txt")
if old_name.exists():
old_name.rename(new_name)
print(f"Переименовано в: {new_name.name}")
10. Перемещение файла (Замена shutil.move)
Хотя для сложных операций (копирование дерева, перемещение между дисками) shutil по-прежнему необходим, для простого перемещения файла достаточно использовать Path.replace().
from pathlib import Path
# Предположим, мы переносим файл
source = Path("сообщение.txt")
target_dir = Path("архив")
target_dir.mkdir(exist_ok=True)
# Перенос файла в папку 'архив'
target_path = target_dir / source.name
source.replace(target_path)
print(f"Файл перемещен в {target_path}")
11. Получение относительного пути
Иногда нужно получить путь не от корня файловой системы, а от определенной базовой папки. Метод relative_to() выполняет эту задачу без необходимости вручную обрабатывать строки.
from pathlib import Path
base = Path("/home/user/project/src")
target = Path("/home/user/project/src/models/model.py")
relative_path = target.relative_to(base)
print(f"Относительный путь: {relative_path}") # models/model.py
12. Удаление файлов и каталогов
Для удаления файлов используется unlink(), а для удаления пустых каталогов — rmdir(). Если вам нужно рекурсивно удалить непустой каталог (как shutil.rmtree), придется использовать shutil.
from pathlib import Path
# Удаление файла
file_to_delete = Path("архив/сообщение.txt")
if file_to_delete.exists():
file_to_delete.unlink()
print(f"Файл {file_to_delete.name} удален.")
# Удаление пустого каталога
empty_dir = Path("архив")
if empty_dir.exists() and empty_dir.is_dir() and not list(empty_dir.iterdir()):
empty_dir.rmdir()
print(f"Каталог {empty_dir.name} удален.")
✅ H2: Заключение
Pathlib — это не просто альтернатива, это современный стандарт работы с путями в Python. Использование объектно-ориентированного подхода делает ваш код интуитивно понятным, более читаемым и, что критически важно, защищенным от ошибок, связанных с разделителями путей на разных операционных системах.
Мы рассмотрели 12 ключевых python pathlib примеров, от базового объединения путей до сложных рекурсивных обходов и атомарного переименования. Начните применять эти приемы уже сегодня, и вы заметите, как сильно упростится ваш код!
• Как писать чистый и читаемый код на Python — улучшите качество своего кода, используя принципы Pathlib
• Python-скрипт: автоматическая сортировка файлов — используйте Pathlib для создания мощного скрипта
• 10 ошибок новичков в Python — избегайте типичных проблем при работе с файлами
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и Python.
👉 Ваш интерес — лучшая мотивация для новых статей!