Модуль Pathlib в Python упрощает работу с файлами и папками. Он доступен в Python 3.4 и более поздних версиях. Pathlib сочетает в себе лучшее из модулей файловой системы Python — os, os.path, glob и так далее.
Содержание статьи
- Концепт пути и директории в Python
- Как использовать модуль Pathlib?
- Зачем использовать модуль Pathlib?
- Создание и удаление папок через Pathlib
- Генерация кроссплатформенных путей в Pathlib
- Получение информации о пути в Pathlib
- Альтернатива для модуля glob
- Чтение и запись файлов с использованием Pathlib
В Python большинство скриптов предполагает работу с файловыми системами. Следовательно, неизбежно взаимодействие с названиями файлов и путями. Именно для этого в Python есть модуль Pathlib, который содержит полезные функции для выполнения задач, связанных с файлами. Pathlib предоставляет удобный для чтения и простой способ создания путей, представляя пути файловой системы в виде надлежащих объектов. Модуль позволяет создавать код, который можно переносить между платформами.
В данной статье мы подробно изучим модуль Pathlib с помощью различных примеров.
Концепт пути и директории в Python
Перед началом подробного рассмотрения модуля Pathlib важно разобраться в разнице между главными концептами темы — путем (path) и директорией (directory).
- Путь используется для идентификации файла. Путь предоставляет необязательную последовательность названий директорий, в конце которой значится конечное имя файла, а также его расширение;
- Расширение названия файла предоставляет некоторую информацию о формате/содержимом файла. Модуль Pathlib может работать как с абсолютными, так и с относительными путями;
- Абсолютный путь начинается с корневой директории и определяет полное дерево каталогов;
- Относительный путь, как следует из названия, является путем к файлу относительно другого файла или директории, обычно текущей;
- Директория представляет собой запись пути в файловой системе и включает название файла, время создания, размер, владельца и так далее.
Модуль Pathlib в Python занимается задачами, связанными с путями, такими как создание новых путей из названий файлов и других путей, проверка различных свойств путей, создание файлов и папок по определенным путям.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Как использовать модуль Pathlib?
Для работы с Pathlib в Python требуется импортировать все классы данного модуля, используя следующую команду:
1 |
from pathlib import * |
В качестве первого задания давайте извлечем текущую рабочую директорию и домашнюю директорию объектов, используя следующий код:
1 2 3 4 5 |
current_dir = Path.cwd() home_dir = Path.home() print(current_dir) print(home_dir) |
Вместо импорта всех классов можно использовать import pathlib
. В таком случае, задействуя классы внутри модуля, требуется добавлять через pathlib
.
1 2 3 4 5 6 7 |
import pathlib current_dir = pathlib.Path.cwd() home_dir = pathlib.Path.home() print(current_dir) print(home_dir) |
Зачем использовать модуль Pathlib?
Если вы некоторое время работали с языком Python, у вас может возникнуть вопрос. Зачем нужен модуль Pathlib, когда уже есть модули os
, os.path
, glob
и прочие? Это хороший вопрос. Давайте попробуем ответить на него, разобрав следующий пример.
Допустим, мы хотим создать файл под названием "output/output.xlsx"
в текущем рабочем каталоге. Следующий код пытается сделать это с помощью модуля os.path
. Также используются функции os.getcwd
и os.path.join
.
1 2 3 4 |
import os outpath = os.path.join(os.getcwd(), 'output') outpath_file = os.path.join(outpath, 'out.xlsx') |
Альтернативный способ:
1 |
outpath_file = os.pathjoin(os.path.join(os.getcwd(), 'output'), "out.xlsx") |
Хотя код работает, он выглядит несколько странно, плохо читается, в нем сложно уловить суть. Представьте, как данный код выглядел бы, если бы мы хотели создать новый файл внутри глубоко расположенной директории.
Данный код можно переписать, используя модуль Pathlib:
1 2 |
from pathlib import Path outpath = Path.cwd() / 'output' / 'output.xlsx' |
Такой формат проще укладывается в голове. В Pathlib функция
Path.cwd()
используется для получения текущего рабочего каталога, а оператор/
используется вместоos.path.join
для объединения частей пути в составной объект пути.
Шаблон вложенности функций в модуле os.path
заменяется классом Path
модуля Pathlib, что представляет путь через объединение методов и атрибутов. Умная перегрузка оператора /
делает код читабельным и простым в обращении.
Другое преимущество метода, предоставляемого модулем Pathlib, заключается в том, что объект Path
создается вместо строкового представления пути. У этого объекта есть несколько удобных методов, что имеют значительное преимущество перед работой с необработанными строками, которые представляют пути.
Создание и удаление папок через Pathlib
Классический модуль os.path
используется только для манипуляции строками пути. Чтобы что-то сделать с путем, например, создать директорию, нам нужен модуль os
. Модуль os
предоставляет набор функций для работы с файлами и каталогами, например: mkdir
для создания директории, rename
для переименования, а getsize
для получения ее размера.
Давайте напишем некоторые из этих операций с помощью модуля os
, а затем перепишем тот же код с помощью модуля Pathlib.
Пример кода, написанный с использованием модуля os
:
1 2 |
if os.path.isdir(path): os.rmdir(path) |
Если мы используем объекты path
модуля Pathlib для достижения той же функциональности, конечный код будет читабельнее и легче для понимания:
1 2 |
if path.is_dir() path.rmdir() |
В модуле os
сложновато найти утилиты, связанные с путем. Модуль Pathlib решает эту проблему, заменяя утилиты модуля os
методами объектов путя. Давайте попробуем разобраться в этом на примере следующего кода:
1 2 3 4 5 6 7 8 |
outpath = os.path.join(os.getcwd(), 'output') outpath_tmp = os.path.join(os.getcwd(), 'output.tmp') generate_data(output_tmp) if os.path.getsize(output_tmp): os.rename(outpath_tmp, outpath) else: # Ничего не происходит os.remove(outpath_tmp) |
Здесь функция generate_data()
принимает путь к файлу в качестве параметра и записывает данные в другой путь. Однако, если файл, который передается в качестве параметра, не изменяется, так как в последний раз была выполнена функция generate_data()
, генерируется пустой файл. В этом случае пустой файл заменяется предыдущей версией файла.
Переменная outpath
сохраняет данные, соединяя текущий рабочий каталог с названием файла «output». Мы также создаем временную версию, названную outpath.tmp
. Если размер временной версии не равен нулю, что означает, что это не пустой файл, тогда временная версия переименовывается в outpath
, в противном случае временная версия удаляется, а старая версия сохраняется.
Используя модуль os
, манипулирование путями файловых систем в виде строковых объектов становится несколько корявым, поскольку используется несколько вызовов os.path.join()
, os.getcwd()
и так далее. Во избежание данной проблемы модуль Pathlib предлагает набор классов, что могут использоваться для популярных операций с путами через более читабельный, простой, объектно-ориентированный способ.
Попробуем переписать вышеуказанный код с модулем Pathlib:
1 2 3 4 5 6 7 8 9 10 11 |
from pathlib import Path outpath = Path.cwd() / 'output' outpath_tmp = Path.cwd() / 'output_tmp' generate_data(output_tmp) if outpath_tmp.stat().st_size: outpath_tmp.rename(outpath) else: # Ничего не производится Path_tmp.unlink() |
При использовании Pathlib os.getcwd()
становится Path.cwd()
, а оператор '/'
нужен для объединения путей на месте os.path.join
. Вместе с модулем Pathlib можно значительно упростить код, задействуя операторы и вызовы метода.
Популярные методы и их предназначение:
Path.cwd()
: Возвращает путь объекта текущей рабочей директории;Path.home()
: Возвращает путь объекта домашней директории;Path.stat()
: Возвращает информацию о пути;Path.chmod()
: Меняет режим и уровень доступа файла;Path.glob(pattern)
: Получение всех файлов которые соответствую паттерну, например*.jpg
(все картинки) или*.mp3
(все песни);Path.mkdir()
: создает новую папку по данному пути;Path.open()
: Открывает файл, созданный в пути;Path.rename()
: Переименовывает файл или директорию указанной цели;Path.rmdir()
: Удаляет пустую директорию;Path.unlink()
: Удаляет файл или символическую ссылку.
Генерация кроссплатформенных путей в Pathlib
Пути используют разные соглашения в разных операционных системах. Windows использует обратный слеш \
между названиями папок, тогда как все другие популярные операционные системы используют прямой слеш /
.
Если вы хотите, чтобы ваш код работал, независимо от базовой ОС, вам нужно будет обрабатывать различные соглашения, характерные для базовой платформы. Модуль Pathlib упрощает работу с путями к файлам. В Pathlib можно просто передать путь или название файла объекту Path()
, используя слеш, независимо от ОС. Pathlib занимается всем остальным.
1 |
pathlib.Path.home() / 'python' / 'samples' / 'test_me.py' |
Объект Path()
конвертирует /
в слеш соответствующий операционной системе. pathlib.Path
может представлять путь Windows или Posix. Кроме того, Pathlib решает многие кросс-функциональные баги, легко обрабатывая пути.
Получение информации о пути в Pathlib
Во время работы с путями зачастую требуется найти родительскую директорию файла/папки или получить символические ссылки. У класса Path есть несколько удобных для этого методов, различные части пути доступны как свойства, что включают следующее:
drive
: строка, что представляет название жесткого диска. К примеру,PureWindowsPath('c:/Program Files/CSV').drive
вернет"C:"
;parts
: возвращает кортеж, что дает доступ к компонентам пути;name
: компонент пути без директории;parent
: последовательность обеспечивает доступ к логическим предкам пути;stem
: финальный компонент пути без суффикса;suffix
: разрешение файла финального компонента;anchor
: часть пути перед директорией./
используется для создания дочерних путей и имитации поведенияos.path.join
;joinpath
: совмещает путь с предоставленными аргументами;match(pattern)
: возвращаетTrue/False
, основываясь на совпадении пути с предоставленным шаблоном поиска.
Например, у нас есть данный путь "/home/projects/pyscripts/python/sample.md"
:
path
: — возвращает PosixPath(‘/home/projects/pyscripts/python/sample.md’);path.parts
: — возвращает (‘/’, ‘home’, ‘projects’, ‘pyscripts’, ‘python’);path.name
: — возвращает ‘sample.md’;path.stem
: — возвращает ‘sample’;path.suffix
: — возвращает ‘.md’;path.parent
: — возвращает PosixPath(‘/home/projects/pyscripts/python’);path.parent.parent
: — возвращает PosixPath(‘/home/projects/pyscripts’);path.match('*.md')
: возвращает True;PurePosixPath('/python').joinpath('edited_version')
: возвращает (‘home/projects/pyscripts/python/edited_version.
Альтернатива для модуля glob
Помимо модулей os
, os.path
в Python также доступен модуль glob
, что предоставляет путь связанных утилит. Функция glob.glob
модуля glob
используется для нахождения файлов, соответствующих шаблону.
1 2 3 4 |
from glob import glob top_xlsx_files = glob('*.xlsx') # Все файлы с расширением .xlsx all_xlsx_files = glob('**/*.xlsx', recursive=True) |
Pathlib предоставляет свою реализацию glob
:
1 2 3 4 |
from pathlib import Path top_xlsx_files = Path.cwd().glob('*.xlsx') all_xlsx_files = Path.cwd().rglob('*.xlsx') |
Функциональность glob доступна с объектами Path
. Следовательно, модуль Pathlib упрощают сложные задачи.
Чтение и запись файлов с использованием Pathlib
Следующие методы используются для выполнения основных операций, таких как чтение и запись файлов:
read_text
: Файл открывается в текстовом режиме для чтения содержимого файла и его закрытия после чтения;read_bytes
: Используется для открытия файла в бинарном режиме, возвращения содержимого в бинарном форме и последующего закрытия файла;write_text
: Используется для открытия файла, записи туда текста и последующего закрытия;write_bytes
: Используется для записи бинарных данных в файл и закрытия файла по завершении процесса.
Давайте испытаем модуль Pathlib используя популярные файловые операции. Следующий пример используется для чтения содержимого файла:
1 2 |
path = pathlib.Path.cwd() / 'Pathlib.md' path.read_text() |
Метод read_text()
для объекта Path
используется для чтения содержимого файла. В примере ниже данные записываются в файл, в текстовом режиме:
1 2 3 4 |
from pathlib import Path p = Path('sample_text_file') p.write_text('Образец данных для записи в файл') |
Таким образом, в модуле Pathlib наличие пути в качестве объекта позволяет выполнять полезные действия над объектами для файловой системы, включая множество манипуляций с путями, таких как создание или удаление каталогов, поиск определенных файлов, перемещение файлов и так далее.
Заключение
Модуль Pathlib предоставляет огромное количество полезных функций, которые можно использовать для выполнения различных операций, связанных с путями. В качестве дополнительного преимущества библиотека согласовывается с операционной системой.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»