Управление файловыми путями с помощью 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