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

Модуль Pathlib в Python упрощает работу с файлами и папками. Модуль Pathlib доступен в Python 3.4 и более поздних версиях. Он сочетает в себе лучшие модули файловой системы Python, а именно: os [https://docs.python.org/3/library/os.html], os.path [https://docs.python.org/3/library/os .path.html], glob [https://docs.python.org/3/library/glob.html] и т. д. В Python большинство сценариев предполагает взаимодействие с файловыми системами. Следовательно, важно иметь дело с именами файлов и патчем.

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

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

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

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

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

Путь используется для идентификации файла. Путь обеспечивает необязательную последовательность имен каталогов, заканчивающуюся конечным именем файла, включая расширение имени файла. Расширение имени файла предоставляет некоторую информацию о формате / содержимом файла. Модуль 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.path. Для этого os.getcwd функции 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) 

Если мы используем объекты 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(pattern) : скопируйте шаблон, указанный в каталоге, который представлен путем, в результате чего будут найдены совпадающие файлы любого типа.
  • 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(pattern) : возвращает 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 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 наличие пути в качестве объекта позволяет нам выполнять полезные действия с объектами для файловой системы, включая множество манипуляций с путями, таких как создание или удаление каталогов, поиск определенных файлов, перемещение файлов и т. Д.

Заключение

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

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus