Работа с путями и файловой системой
Строим, разбираем и обходим пути к файлам переносимо с помощью pathlib и os
Главная идея: В начальном курсе вы открывали файл, жёстко прописывая его имя. Реальные программы редко знают точный путь заранее: они собирают его из частей, проверяют существование, перечисляют содержимое папки и обходят целые деревья каталогов. Современный инструмент Python для этого -
pathlib.Path: объект, который относится к пути как к структурированным данным, а не как к хрупкой строке. Старый модуль os по-прежнему закрывает несколько пробелов, поэтому вы встретите оба.
К концу вы сможете:
- объяснить, почему склейка путей через
"+"и"/"ломается на разных операционных системах, - безопасно строить пути с помощью
Pathи оператора/, - разбирать путь на части:
.name,.stem,.suffix,.parentи.parts, - проверять существование и тип через
.exists(),.is_file(),.is_dir(), - создавать папки с
.mkdir(parents=True, exist_ok=True), - перечислять и фильтровать содержимое каталога с
.iterdir(),.glob()и.rglob(), - обойти всё дерево папок и понимать, когда лучше взять
os.
1. Проблема: путь - это не просто строка
Путь выглядит как обычная строка, поэтому первый соблазн - склеить куски через +:
folder = "data"
name = "report.txt"
path = folder + "/" + name # "data/report.txt" - хрупко!
Это работает по удаче, а не по замыслу. Внутри прячутся две реальные проблемы:
- Разделители различаются. Linux и macOS разделяют папки прямым слэшем
/; Windows использует обратный слэш\. Жёстко прописав один, вы ломаете другую машину. - Копятся крайние случаи. А заканчивается ли
folderуже слэшем? Не пуста ли часть? Строковая арифметика заставляет обрабатывать каждый случай вручную, и один пропуск портит путь.
pathlib решает это, делая путь объектом, который умеет правильно соединять, разбивать и сравнивать себя на любой операционной системе, где он запущен.