Управление файловыми путями с помощью pathlib

Раздел: Файловая система -> Управление путями

При работе с файловой системой важно правильно манипулировать путями: создавать, изменять, проверять существование, обходить директории. Python предоставляет несколько инструментов, среди которых наиболее современным и удобным считается модуль pathlib.

Способы работы с файловыми путями

Модуль pathlib как основное средство

Path - класс, представляющий путь к файлу или директории

Модуль pathlib появился в Python 3.4 и стал полноценной заменой os.path. Его главное преимущество - работа с путями как с объектами, а не строками. Это позволяет использовать оператор / для конкатенации, обращаться к компонентам пути через атрибуты (parent, name, stem, suffix) и выполнять файловые операции вызовом методов.


from pathlib import Path

base = Path("data")
sub = base / "images" / "photo.jpg"   # data/images/photo.jpg
print(sub.parent)                     # data/images
print(sub.suffix)                     # .jpg
print(sub.stem)                       # photo
  

Python local path (локальный путь в python)

Пример создания директории


new_dir = Path("/tmp/new_folder")
new_dir.mkdir(parents=True, exist_ok=True)  # создаёт все промежуточные папки
  

Python path lib (путь к библиотекам python)

Проверка существования и типа


p = Path("some_file.txt")
if p.exists():
    print(p.is_file(), p.is_dir())
  

Python script path (путь к текущему скрипту python)

Типичные ошибки:

  • FileExistsError при mkdir, если директория уже существует. Решение: параметр exist_ok=True.
  • FileNotFoundError при попытке открыть несуществующий файл через read_text(). Следует предварительно проверять exists().
  • Ошибка при использовании обратного слеша в Windows: pathlib корректно обрабатывает оба стиля разделителей, но рекомендуется использовать прямой слеш или библиотечные функции.

Как получить список файлов в каталоге с помощью os.listdir?

Функция os.listdir возвращает только имена объектов, без полного пути. Для получения полных путей требуется объединение с помощью os.path.join.


import os

folder = "documents"
files = os.listdir(folder)
full_paths = [os.path.join(folder, f) for f in files]
print(full_paths)
  

Python create path (создание пути в python)

Этот подход удобен для простых задач, но не даёт информации о типе объекта (файл или директория) без дополнительных вызовов.

Возможные проблемы:

  • Вызов os.listdir для несуществующей директории вызывает FileNotFoundError. Необходима предварительная проверка os.path.exists().
  • В больших каталогах список может быть очень большим, потребляя память. Для потокового обхода лучше использовать os.scandir.

Как проверить существование файла, не используя pathlib?

Модуль os.path предоставляет функции exists, isfile, isdir. Они принимают строку с путём.


import os.path

path = "config.json"
if os.path.exists(path):
    print(os.path.isfile(path))
  

Недостаток: работа с путями остаётся строковой, трудно составлять сложные конструкции.

Ошибка: при передаче пути с символом тильды (~) os.path.exists не раскрывает его. Для раскрытия нужна os.path.expanduser.

Как найти файлы по шаблону с глоббингом без pathlib?

Модуль glob позволяет искать файлы по шаблону. Результат - список строк.


import glob

txt_files = glob.glob("data/*.txt")
print(txt_files)
  

Pathlib предлагает аналогичный метод .glob() с тем же синтаксисом шаблона.

Проблемы:

  • Результаты glob - строки, а не объекты Path, что усложняет последующие операции.
  • Не поддерживает рекурсивный обход по умолчанию (используется ** или Python 3.5+ с рекурсивным флагом).

Как объединить части пути без pathlib?

Функция os.path.join правильно склеивает компоненты, учитывая разделитель операционной системы.


import os

base_path = "home/user"
file_name = "document.txt"
full_path = os.path.join(base_path, "docs", file_name)
  

Проблема: если в компонентах уже есть разделители, os.path.join может дать неожиданный результат. Pathlib решает это благодаря перегрузке оператора /.

Распространённая ошибка: использование прямой конкатенации строк с + и вручную вставленным разделителем приводит к некорректным путям на разных ОС. Например, "home" + "/" + "file" в Windows не сработает.

Расширенные примеры использования pathlib

Пример 1: Рекурсивный обход каталогов с rglob

Пример

from pathlib import Path

directory = Path("project")
for py_file in directory.rglob("*.py"):
    print(py_file)
project/main.py
project/utils/helper.py
project/tests/test_app.py

Пример 2: Чтение и запись текстового файла

Пример

from pathlib import Path

file = Path("hello.txt")
file.write_text("Привет, мир!")
content = file.read_text(encoding="utf-8")
print(content)
Привет, мир!

Пример 3: Изменение имени файла с сохранением расширения

Пример

from pathlib import Path

old = Path("report_2024.txt")
new_stem = "report_2025"
new_file = old.with_stem(new_stem)   # old.with_name(new_stem + old.suffix)
old.rename(new_file)
print(new_file)
report_2025.txt

Пример 4: Создание временного файла с помощью tempfile

Пример

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as tmpdir:
    tmp = Path(tmpdir) / "data.bin"
    tmp.write_bytes(b"\x00\x01\x02")
    print(tmp.read_bytes())
b'\x00\x01\x02'

Пример 5: Использование Path.home() и Path.cwd()

Пример

from pathlib import Path

home = Path.home()
current = Path.cwd()
print("Домашний каталог:", home)
print("Текущий рабочий каталог:", current)
config = home / ".config" / "app"
print("Путь к конфигурации:", config)
Домашний каталог: /home/user
Текущий рабочий каталог: /home/user/projects
Путь к конфигурации: /home/user/.config/app

Пример 6: Работа с символическими ссылками

Пример

from pathlib import Path

link = Path("link_to_file")
if link.is_symlink():
    real = link.resolve()
    print("Ссылка ведёт на:", real)
Ссылка ведёт на: /mnt/backup/important.txt

Пример 7: Использование PurePath для операций без обращения к файловой системе

Пример

from pathlib import PurePosixPath

p = PurePosixPath("/var/log/system.log")
print(p.parts)       # ('/', 'var', 'log', 'system.log')
print(p.with_name("app.log"))  # /var/log/app.log
('/', 'var', 'log', 'system.log')
/var/log/app.log

Пример 8: Получение информации о файле через stat()

Пример

from pathlib import Path
import stat

file = Path("script.sh")
st = file.stat()
print("Размер:", st.st_size)
print("Права доступа:", oct(st.st_mode)[-3:])
Размер: 512
Права доступа: 755

Путь к библиотекам Python - comments

En
Python path lib (python)