12 хитрых приёмов Pathlib, которые заменяют os и shutil

    📝 Кратко: Библиотека `pathlib` — это современный, объектно-ориентированный способ работы с файловой системой, который делает код чище и безопаснее, чем устаревшие функции `os.path`. Мы собрали 12 ключевых **python pathlib примеров**, чтобы вы смогли полностью заменить `os` и `shutil`.
12 хитрых приёмов Pathlib

Привет! Если вы пишете на 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-трюкам и чистому коду, посмотрите также:
Как писать чистый и читаемый код на Python — улучшите качество своего кода, используя принципы Pathlib
Python-скрипт: автоматическая сортировка файлов — используйте Pathlib для создания мощного скрипта
10 ошибок новичков в Python — избегайте типичных проблем при работе с файлами
💬 Остались вопросы? Пишите в комментариях — с радостью уточню, дополню или помогу с вашим кодом.
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и Python.
👉 Ваш интерес — лучшая мотивация для новых статей!

Оставьте комментарий