Рубрики
Без рубрики

Введение в модуль Python Pathlib

Автор оригинала: Guest Contributor.

Введение в модуль Python Pathlib

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

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

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

Понятие Пути и каталога

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

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

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

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

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

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

from pathlib import *

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

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

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

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 .

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 для объединения частей пути в составной объект path. Шаблон вложенности функций в модуле os.path заменяется классом Path модуля Pathlib, который представляет путь с помощью цепочек методов и атрибутов. Умная перегрузка оператора / делает код читаемым и простым в обслуживании.

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

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

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

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

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

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

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

if path.is_dir()
    path.rmdir()

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

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 () , то создается пустой файл. В этом случае пустой файл заменяется предыдущей версией файла.

Переменная output хранит данные, соединяя текущий рабочий каталог с именем файла “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, представляющий текущий рабочий каталог
  • Path.home() : Возвращает объект path, представляющий домашний каталог
  • Path.stat() : возвращает информацию о пути
  • Path.chmod() : изменение режима файла и прав доступа
  • Path.glob(pattern) : 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() преобразует символ /| в слэш apt для базовой операционной системы. pathlib.Path может представлять либо путь Windows, либо путь Posix. Таким образом, Path lib решает множество кросс-функциональных ошибок, легко обрабатывая пути.

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

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

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

In path “/home/projects/stackabuse/python/sample.md”:

  • path : – возвращает PosixPath(‘/home/projects/stackabuse/python/sample.md’)
  • path.parts : – returns (‘/’, ‘home’, ‘projects’, ‘stackabuse’, ‘python’)
  • path.name : – возвращает ‘sample.md’
  • path.stem : – возвращает ‘sample’
  • path.suffix : – возвращает ‘.md’
  • path.parent : – возвращает PosixPath(‘/home/projects/stackabuse/python’)
  • path.parent.parent : – возвращает Posix Path(‘/home/projects/stack abuse’)
  • path.match('*.md') : возвращает True
  • PurePosixPath('/python').joinpath('edited_version') : returns (‘home/projects/stackabuse/python/edited_version

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

Помимо os , os.path modules, glob module также доступен в Python, который предоставляет utils, связанные с путем к файлу. 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')

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

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

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

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

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

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

Здесь read_text метод on Path object используется для чтения содержимого файла. Приведенный ниже пример используется для записи данных в файл в текстовом режиме:

from pathlib import Path

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

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

Вывод

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