Модуль Pathlib в Python

Модуль Pathlib в Python упрощает работу с файлами и папками. Модуль доступен в Python 3.4 и более поздних версиях. Он сочетает в себе лучшие модули файловой системы, а именно os, os.path, glob и т.д.

В Python большинство скриптов связано с файловыми системами. Следовательно, важно иметь дело с именами файлов и путями. Для этого Python включает модуль Pathlib, который содержит полезные функции для выполнения задач, связанных с файлами. Pathlib предоставляет более читаемый и простой способ создания путей, представляя пути файловой системы как правильные объекты, и позволяет нам писать код, переносимый между платформами.

В этой статье мы подробно рассмотрим модуль Pathlib на различных примерах.

Концепция пути и каталога

Прежде чем углубляться в детали модуля Pathlib, важно понять 2 различных понятия, а именно – путь и каталог.

Путь используется для идентификации файла. Путь обеспечивает необязательную последовательность имен каталогов, заканчивающуюся конечным именем файла, включая расширение имени файла. И предоставляет некоторую информацию о формате и содержимом файла.

Модуль Pathlib в Python может работать как с абсолютными, так и с относительными путями. Абсолютный путь начинается с корневого каталога и указывает полное дерево каталогов, тогда как относительный путь, как следует из названия, представляет собой путь к файлу относительно другого файла или каталога (обычно текущего каталога).

Каталог представляет собой запись пути в файловой системе и включает имя файла, время создания, размер, владельца и т.д.

Модуль Pathlib в Python занимается задачами, связанными с путями, такими как построение новых путей из имен файлов и из других путей, проверка различных свойств путей и создание файлов и папок по определенным путям.

Как использовать модуль?

Чтобы удобно использовать модуль pathlib в наших скриптах, мы импортируем все классы в нем, используя:

from pathlib import *

В качестве первой задачи давайте извлечем объекты текущего рабочего каталога и домашнего каталога соответственно, используя приведенный ниже код:

current_dir = Path.cwd()
home_dir = Path.home()
print(current_dir)
print(home_dir)

Мы можем выбрать импорт pathlib вместо импорта всех классов. В этом случае все последующие использования классов в модуле должны иметь префикс pathlib.

import pathlib

current_dir = pathlib.Path.cwd()
home_dir = pathlib.Path.home()
print(current_dir)
print(home_dir)

Зачем использовать?

Если вы какое-то время работали с языком Python, вам может быть интересно, зачем нужен модуль Pathlib, если модули os, os.path, glob и т.д. уже доступны? Это вполне оправданное беспокойство. Попробуем разобраться в этом на примере.

Допустим, мы хотим создать файл с именем «output или output.xlsx» в текущем рабочем каталоге. Следующий код пытается добиться этого с помощью модуля os.path. Для этого используются функции os.getcwd и os.path.join.

import os
outpath = os.path.join(os.getcwd(), 'output')
outpath_file = os.path.join(outpath, 'out.xlsx')

Альтернативно:

outpath_file = os.pathjoin(os.path.join(os.getcwd(), 'output'), "out.xlsx")

Хотя код работает, он выглядит неуклюже, нечитабелен и не прост в обслуживании. Представьте, как бы выглядел этот код, если бы мы хотели создать новый файл внутри нескольких вложенных каталогов.

Тот же код можно переписать с помощью модуля Pathlib следующим образом:

from pathlib import Path
outpath = Path.cwd() / 'output' / 'output.xlsx'

Этот формат легче разобрать мысленно. В Pathlib функция Path.cwd() используется для получения текущего рабочего каталога, а оператор / используется вместо os.path.join для объединения частей пути в объект составного пути.

Шаблон вложения функций в модуле os.path заменяется классом Path модуля Pathlib, который представляет путь путем объединения методов и атрибутов. Умная перегрузка оператора / делает код удобочитаемым и простым в обслуживании.

Еще одно преимущество метода, предоставляемого модулем Pathlib, заключается в том, что создается объект Path, а не строковое представление пути. У этого объекта есть несколько удобных методов, которые делают жизнь проще, чем работа с необработанными строками, представляющими пути.

Выполнение операций на путях

Классический модуль os.path используется только для управления строками пути. Чтобы что-то сделать с путем, например, создать каталог, нам понадобится модуль os. Модуль os предоставляет набор функций для работы с файлами и каталогами, например: mkdir для создания каталога, rename для переименования каталога, getsize для получения размера каталога и так далее.

Давайте напишем некоторые из этих операций с помощью модуля os, а затем перепишем тот же код с помощью модуля Pathlib.

Пример кода, написанного с использованием модуля os:

if os.path.isdir(path):
    os.rmdir(path)

Если мы используем объекты пути модуля Pathlib для достижения той же функциональности, результирующий код будет намного более читаемым и более простым в обслуживании, как показано ниже:

if path.is_dir()
    path.rmdir()

Громоздко найти утилиты, связанные с путями, в модуле os. Модуль Pathlib решает проблему, заменяя утилиты модуля os методами на объектах пути. Давайте разберемся с этим еще лучше с помощью кода:

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: # Nothing produced
    os.remove(outpath_tmp)

Здесь функция generate_data() принимает путь к файлу в качестве параметра и записывает данные по другому пути. Однако, если файл, который передается в качестве параметра, не изменяется, с момента последнего выполнения функции generate_data() создается пустой файл. В этом случае пустой файл заменяется предыдущей версией файла.

Переменная outpath сохраняет данные, объединяя текущий рабочий каталог с именем файла «output». Мы также создаем временную версию с именем outpath.tmp. Если размер временной версии не равен нулю, что означает, что это не пустой файл, временная версия переименовывается в outpath, в противном случае временная версия удаляется, а старая версия сохраняется.

Используя модуль os, манипулирование путями файловых систем в виде строковых объектов становится неудобным, поскольку есть несколько вызовов os.path.join(), os.getcwd() и т.д. Чтобы избежать этой проблемы, модуль Pathlib предлагает набор классов, которые может использоваться для часто используемых операций на пути в более удобочитаемом, простом и объектно-ориентированном виде.

Попробуем переписать приведенный выше код с помощью модуля Pathlib.

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: # Nothing produced
    Path_tmp.unlink()

При использовании Pathlib os.getcwd() становится Path.cwd(), а оператор ‘/’ используется для соединения путей и используется вместо os.path.join. Используя модуль Pathlib, все можно сделать более простым способом, используя операторы и вызовы методов.

Ниже приведены наиболее часто используемые методы и способы их использования:

  • Path.cwd(): объект пути возврата, представляющий текущий рабочий каталог.
  • Path.home(): вернуть объект пути, представляющий домашний каталог.
  • Path.stat(): вернуть информацию о пути.
  • Path.chmod(): изменить режим файла и разрешения.
  • Path.glob (шаблон): объединить шаблон, указанный в каталоге, который представлен путем, в результате чего будут получены соответствующие файлы любого типа.
  • Path.mkdir(): для создания нового каталога по заданному пути.
  • Path.open(): открыть файл, созданный по пути.
  • Path.rename(): переименовать файл или каталог в указанную цель.
  • Path.rmdir(): удалить пустой каталог.
  • Path.unlink(): удалить файл или символическую ссылку.

Создание кроссплатформенных путей

Пути используют разные соглашения в разных операционных системах. Windows использует обратную косую черту между именами папок, тогда как все другие популярные операционные системы используют косую черту между именами папок. Если вы хотите, чтобы ваш код на Python работал независимо от базовой ОС, вам необходимо учитывать различные соглашения, характерные для базовой платформы. Модуль Pathlib упрощает работу с путями к файлам. В Pathlib вы можете просто передать путь или имя файла объекту Path(), используя косую черту, независимо от ОС. Все остальное сделает Pathlib.

pathlib.Path.home() / 'python' / 'samples' / 'test_me.py'

Объект Path() преобразует / в подходящий вид косой черты для базовой операционной системы. Pathlib.Path может представлять путь Windows или Posix. Таким образом, Pathlib решает множество кросс-функциональных ошибок, легко обрабатывая пути.

Получение информации о пути

Имея дело с путями, мы заинтересованы в поиске родительского каталога файла и папки или в следующих символических ссылках. Класс Path имеет несколько удобных методов для этого, поскольку различные части пути доступны в виде свойств, которые включают следующее:

  • drive: строка, представляющая имя диска. Например, PureWindowsPath (‘c:/Program Files/CSV’). Drive возвращает «C:»
  • parts: возвращает кортеж, который обеспечивает доступ к компонентам пути.
  • name: компонент пути без какого-либо каталога.
  • parent: последовательность, обеспечивающая доступ к логическим предкам пути.
  • stem: последний компонент пути без суффикса.
  • suffix: расширение файла последнего компонента.
  • anchor: часть пути перед каталогом. / используется для создания дочерних путей и имитирует поведение os.path.join.
  • joinpath: объединяет путь с предоставленными аргументами.
  • match (шаблон): возвращает True и False на основе сопоставления пути с предоставленным шаблоном в стиле глобуса.

По пути «/home/projects/stackabuse/python/sample.md»:

  • path: возвращает PosixPath (‘/home/projects/stackabuse/python/sample.md’).
  • path.parts: возвращает (‘/’, ‘home’, ‘projects’, ‘stackabuse’, ‘python’).
  • path.name: возвращает sample.md.
  • path.stem: возвращает образец.
  • path.suffix: возвращает ‘.md’.
  • path.parent: возвращает PosixPath (‘/home/projects/stackabuse/python’).
  • path.parent.parent: возвращает PosixPath (‘/home/projects/stackabuse’)
  • path.match (‘*. md’): возвращает True.
  • PurePosixPath (‘/ python’). Joinpath (‘edited_version’): возвращает (‘home/projects/stackabuse/python/edited_version.

Альтернатива модуля Glob

Помимо модулей os, os.path, в Python также доступен модуль glob, который предоставляет утилиты, связанные с путями к файлам. Функция glob.glob модуля glob используется для поиска файлов, соответствующих шаблону.

from glob import glob

top_xlsx_files = glob('*.xlsx')
all_xlsx_files = glob('**/*.xlsx', recursive=True)

В pathlib также есть утилиты glob:

from pathlib import Path

top_xlsx_files = Path.cwd().glob('*.xlsx')
all_xlsx_files = Path.cwd().rglob('*.xlsx')

Функциональность глобуса доступна с объектами Path. Таким образом, модули pathlib упрощают сложные задачи.

Чтение и запись файлов с использованием Pathlib

Следующие методы используются для выполнения основных операций, таких как чтение и запись файлов:

  • read_text: файл открывается в текстовом режиме, чтобы прочитать содержимое файла и закрыть его после прочтения.
  • read_bytes: используется для открытия файла в двоичном режиме и возврата содержимого в двоичной форме, после чего закрывает файл.
  • write_text: используется для открытия файла и записи текста, а затем его закрытия.
  • write_bytes: используется для записи двоичных данных в файл и закрывает файл после завершения.

Давайте рассмотрим использование модуля Pathlib для общих файловых операций. Следующий пример используется для чтения содержимого файла:

path = pathlib.Path.cwd() / 'Pathlib.md'
path.read_text()

Здесь метод read_text объекта Path используется для чтения содержимого файла.

from pathlib import Path

p = Path('sample_text_file') p.write_text('Sample to write data to a file')

Таким образом, в модуле Pathlib наличие пути в качестве объекта позволяет нам выполнять полезные действия с объектами для файловой системы, включая множество манипуляций с путями, таких как создание или удаление каталогов, поиск определенных файлов, перемещение файлов и т.д.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *