Прощай, os.path: 15 хитростей Pathlib для быстрого освоения файловой системы на Python
Pathlib, возможно, моя любимая библиотека (очевидно, после Sklearn). А учитывая, что в мире насчитывается более 130 тысяч библиотек, это о чём-то да говорит. Pathlib помогает мне превратить подобный код, написанный в os.path...
...в это:
Pathlib появился в Python 3.4 в качестве замены кошмара, которым был os.path. Это также стало важной вехой для языка Python в целом: они, наконец, превратили каждую отдельную вещь в объект.
Самый большой недостаток os.path заключался в рассмотрении системных путей как строк, что приводило к нечитаемому, беспорядочному коду и крутой кривой обучения.
Представляя пути как полноценные объекты, Pathlib решает все эти проблемы и привносит элегантность, согласованность и глоток свежего воздуха в обработку путей.
И в этой моей давно назревшей статье будут описаны некоторые из лучших функций и хитростей pathlib для выполнения задач, которые были бы поистине ужасными в os.path.
Изучение этих функций Pathlib упростит вам, как специалисту по обработке данных, всё, что связано с путями и файлами, особенно во время рабочих процессов обработки данных, когда вам приходится перемещать тысячи изображений, CSV-файлов или аудиофайлов.
Давайте начнём!
Работа с путями
1. Создание путей
Почти все функции pathlib доступны через его класс Path, который вы можете использовать для создания путей к файлам и каталогам.
Есть несколько способов, которыми вы можете создавать пути с помощью Path. Во-первых, существуют методы класса, такие как cwd и home, для текущего рабочего каталога и домашнего каталога пользователя:
Вы также можете создавать пути из строковых путей:
Объединение путей в Pathlib очень просто реализовать с помощью слэша:
Пожалуйста, не позволяйте никому когда-либо поймать вас на использовании os.path.join после этого.
Чтобы проверить, существует ли путь, вы можете использовать логическую функцию exists:
Иногда весь объект Path не будет виден, и вам придётся проверить, является ли он каталогом или файлом. Итак, вы можете использовать функции is_dir или is_file для этого:
Большинство путей, с которыми вы работаете, будут относиться к вашему текущему каталогу. Но бывают случаи, когда вам необходимо указать точное местоположение файла или каталога, чтобы сделать его доступным из любого скрипта Python. Тогда вы можете использовать absolute:
Наконец, если вам не повезло работать с библиотеками, которым всё ещё требуются строковые пути, вы можете вызвать функцию str(path):
2. Атрибуты пути
Объекты Path обладают множеством полезных атрибутов. Давайте посмотрим несколько примеров использования объекта path, который указывает на файл изображения:
Давайте начнём с parent. Он возвращает объект path, который находится на один уровень выше текущего рабочего каталога.
Иногда вам может понадобиться только имя файла (name) вместо полного пути. Для этого есть атрибут...
...который возвращает только имя файла с расширением.
Существует также stem для имени файла без суффикса:
Или suffix для обозначения расширения файла:
Если вы хотите разделить путь на его компоненты, вы можете использовать parts вместо str.split('/'):
Если вы хотите, чтобы эти компоненты сами по себе были объектами Path, вы можете использовать атрибут parents, который создает генератор:
Работа с файлами
Чтобы создавать файлы и записывать в них данные, вам больше не нужно использовать функцию open. Просто создайте объект Path и write_text или write_btyes для них:
Или, если у вас уже есть файл, вы можете использовать read_text или read_bytes:
Однако, обратите внимание, что write_text или write_bytes переопределяют существующее содержимое файла.
Чтобы добавить новую информацию к существующим файлам, вы должны использовать метод open объектов Path в режиме a (добавить):
Также часто используется переименование файлов. Метод rename принимает путь назначения для переименованного файла.
Чтобы создать путь назначения в текущем каталоге, т. е. переименовать файл, вы можете использовать with_stem по существующему пути, который заменяет stem исходного файла:
Выше показано, как file.md превращается в new_markdown.md .
Давайте посмотрим размер файла с помощью stat().st_size:
или последний раз, когда файл был изменён, что произошло несколько секунд назад:
st_mtime возвращает временную метку, которая является отсчётом секунд с 1 января 1970 года. Чтобы сделать его читаемым, вы можете использовать функцию fromtimestamp.
Чтобы удалить ненужные файлы, вы можете разорвать с ними связь (unlink):
Установка missing_ok в значение True не вызовет никаких сигналов тревоги, если файл не существует.
Работа с каталогами
Есть несколько изящных приёмов для работы с каталогами в Pathlib. Сначала давайте посмотрим, как создавать каталоги рекурсивно.
new_dir не существует, поэтому давайте создадим его со всеми его дочерними элементами:
По умолчанию mkdir создаёт последний дочерний элемент заданного пути. Если промежуточные родители не существуют, вы должны установить для parents значение True.
Чтобы удалить пустые каталоги, вы можете использовать rmdir. Если указанный объект path является вложенным, удаляется только последний дочерний каталог:
Чтобы перечислить содержимое каталога типа ls в терминале, вы можете использовать iterdir. Опять же, результатом будет объект-генератор, предоставляющий содержимое каталога в виде отдельных объектов пути по одному за раз:
Чтобы захватить все файлы с определённым расширением или шаблоном имён, вы можете использовать функцию glob с регулярным выражением.
Например, ниже мы найдём все текстовые файлы внутри моего домашнего каталога с помощью glob("*.txt"):
Для рекурсивного поиска текстовых файлов, то есть также внутри всех дочерних каталогов, вы можете использовать rglob:
Вы также можете использовать rglob('*') для рекурсивного перечисления содержимого каталога. Это похоже на перегруженную версию iterdir().
Одним из вариантов использования этого является подсчёт количества форматов файлов, которые отображаются в каталоге.
Чтобы сделать это, мы импортируем класс Counter из коллекций и предоставляем ему все файловые суффиксы в папке articles в home:
Различия в операционной системе
Извините, но мы должны поговорить об этой кошмарной проблеме.
До сих пор мы имели дело с объектами PosixPath, которые используются по умолчанию в UNIX-подобных системах:
Если бы вы использовали Windows, вы бы получили объект WindowsPath:
Создание экземпляра пути к другой системе приводит к ошибке, подобной описанной выше.
Но что, если бы вы были вынуждены работать с путями из другой системы, например, с кодом, написанным коллегами, которые используют Windows?
В качестве решения pathlib предлагает объекты чистого пути, такие как PureWindowsPath или PurePosixPath:
Это примитивные объекты path. У вас есть доступ к некоторым методам и атрибутам path, но, по сути, объект path остаётся строкой:
Заключение
Если вы заметили, я солгал в названии статьи. Я полагаю, что вместо 15 количество новых трюков и функций составило 30 штук.
Я просто не хотел вас напугать.
Но я надеюсь, что убедил вас достаточно, чтобы отказаться от os.path и начать использовать pathlib для гораздо более простых и удобочитаемых операций с путями.
Статья была взята из этого источника: