Автор оригинала: 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')
: возвращает TruePurePosixPath('/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 предоставляет огромное количество богатых и полезных функций, которые могут быть использованы для выполнения различных операций, связанных с путями. В качестве дополнительного преимущества библиотека является согласованной во всей базовой операционной системе.