Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Кратко о задаче
Прежде, чем перейти непосредственно к практической части применения библиотеки pathlib, необходимо повторить матчасть и обсудить основную концепцию файловой системы и её терминологию.
Итак, у нас есть файл example.exe расположенный в C:\Program Files (файловая система Windows). У этого файла есть 4 основные характеристики с точки зрения файловой системы:
- Путь — это идентификатор файла, определяющий его местонахождение в файловой системе, исходя из последовательности названий каталогов. Их разделяют на два типа:
* Абсолютный путь — полный путь файла, начинающийся с корневого каталога. Например, C:\Program Files\example.exe
* Относительный путь — путь к файлу относительно другого каталога. Например, Program Files\example.exe-
Каталог (C:\Program Files) — это объект в файловой системе, необходимой для иерархической организации файловой системы. Иногда его называют директория или папка. Название «папка» отлично описывает практическое название этого объекта — удобное хранение и быстрое нахождение при необходимости.
-
Расширение (.exe) — это формат файла. С помощью расширения пользователь или программы определяют тип данных, хранящихся в файле (видео, текст, музыка и т.д.).
-
Абсолютный путь — полный путь файла, начинающийся с корневого каталога. Например, C:\Program Files\example.exe
-
Относительный путь — путь к файлу относительно другого каталога. Например, Program Files\example.exe
Импортируем модуль pathlib для манипуляции путями файловых систем:
Классы этого модуля можно разбить на два типа: Pure (или «чистые») и Concrete (или «конкретные»). Первые нужны для абстрактной вычислительной работы с путями, при которой не осуществляется непосредственное взаимодействие с файловой системой ОС. Вторые же необходимы для взаимодействия с ней (создания и удаление директорий, чтения файлов и т.д.).
Если вы не уверены, какой класс подходит для выполнения вашей задачи, то, скорее всего, класс Path будет в самый раз. Он позволяет взаимодействовать с файловой системой ОС, под которую сам подстраивается (UNIX или Windows), но и при этом ваша**** манипуляция путями не страдает от ограничений. В рамках этой статьи разберём все классы и их применение, но сосредоточимся конкретно на Path.
Итак, начнем с малого. Создадим переменную с типом данных Path:
>>> PathExample = Path('Simple-Server', 'Cloud', 'Pathlib')
>>> PathExample
WindowsPath('Simple-Server/Cloud/Pathlib')Как видим, модуль сам подстроился под операционную систему — в нашем случае Windows 10. Конструктор Path(args) создает новый экземпляр класса Path и на вход принимает его компоненты (директории, файлы, другие пути).
Путь PathExample — относительный. Чтобы он стал абсолютным необходимо добавить корневой каталог.
С помощью методов Path.home() и Path.cwd() мы можем получить каталог текущего пользователя и текущую рабочую папку:
>>> Path.home()
WindowsPath('C:/Users/Blog)
>>> Path.cwd()
WindowsPath('C:/Users/Blog/AppData/Local/Programs/Python/Python310')Сделаем PathExample абсолютным и рассмотрим другие аспекты работы с pathlib:
>>> PathExample = Path.home() / PathExample
>>> PathExample
WindowsPath('C:/Users/Blog/Simple-Server/Cloud/Pathlib')С помощью оператора «/» мы можем создавать новые пути.
Pathlib предоставляет различные методы и свойства для получения разнообразной информации о путях. Для наглядности добавим введем новую переменную AttributeExample и добавим в неё файл:
>>>AttributeExample = PathExample / 'file.txt'
>>> AttributeExample
WindowsPath('C:/Users/Blog/Simple-Server/Cloud/Pathlib/file.txt')Чтобы узнать букву или имя диска, необходимо использовать свойство.drive:
>>> AttributeExample.drive
'C:'Мы можем получить родительские каталоги с помощью двух свойств: parent и parents[n].
Parent возвращает родительский каталог:
>>> AttributeExample.parent
WindowsPath('C:/Users/Blog/Simple-Server/Cloud/Pathlib')Чтобы получить более «высокие» родительские каталоги, можно использовать parent несколько раз:
>>> AttributeExample.parent.parent
WindowsPath('C:/Users/Blog/Simple-Server/Cloud')Или воспользоваться свойством parents[n], который возвращает n-го предка:
>>> AttributeExample.parents[3]
WindowsPath('C:/Users/Blog)Для получения имени файла нужно использовать свойство .name:
>>> AttributeExample.name
'file.txt'Для того, чтобы получить расширение файла, необходимо использовать свойство .suffix или .suffixes (при наличии двойного расширения, например .tar.gz):
>>> AttributeExample.suffix
'.txt'
>>> Path('file.tar.gz').suffixes
['.tar', '.gz']Мы можем определить, является ли путь абсолютным, с помощью метода .is_absolute():
>>> AttributeExample.is_absolute()
TrueМы можем разложить путь на компоненты с помощью свойства .parts:
>>> AttributeExample.parts
('C:\\', 'Users', ‘Blog’, 'Simple-Server', 'Cloud', 'Pathlib', 'file.txt')Мы можем сравнивать пути как с помощью операторов сравнения, так и с помощью различных методов.
Мы можем узнать, являются ли пути одинаковыми:
>>>Path('Simple-Server') == Path('Simple-Server')
TrueСтоит упомянуть, что такое же сравнение для UNIX-систем будет давать результат False:
>>> PurePosixPath('Simple-Server') == PurePosixPath('Simple-Server')
FalseЭто связано с тем, что в Windows регистр не имеет значения в имени директории, в отличие от файловой системы UNIX-систем.
Мы можем узнать, является ли один путь частью другого, с помощью метода .is_relative_to():
>>> CompareExample = AttributeExample
>>> CompareExample.is_relative_to('C:')
True
>>> CompareExample.is_relative_to('D:/')
FalseТакже можно использовать шаблоны для проверки с помощью метода .match():
>>> CompareExample.match('*.txt')
TrueСоздание и удаление папок и файлов
Для создания папок с помощью модуля pathlib необходимо использовать метод .mkdir(parents = True/False, exist_ok =True/False). Метод получает на вход (помимо пути, по которому нужно создать папку) 2 логические переменные: parents и exist_ok.
Если значение parents = True, то метод создаст родительские каталоги (при их отсутствии). Если False, то вернет ошибку при их отсутствии.
Exist_ok отвечает за обработку ошибок, возникающих при существовании целевой папки.
Создадим папку CreateExample, но сначала проверим, есть ли уже такая директория с помощью метода .is_dir():
>>> CreateExample = CompareExample
>>> CreateExample.is_dir()
FalseТеперь попробуем его создать:
>>> CreateExample.mkdir(parents = True, exist_ok = True)
>>> CreateExample.is_dir()
TrueПроверим папку в проводнике:
Как видим, появилась именно папка, а не файл. Чтобы создать пустой файл, необходимо использовать метод .touch(). Но сначала удалим папку file.txt с помощью метода .rmdir():
>>> CreateExample.rmdir()
>>> CreateExample.touch()
>>> CreateExample.is_file()
TrueДля удаления файлов существует метод .unlink().
На основе имеющегося каталога создадим более сложную структуру:
>>> SearchingExample = CreateExample
>>> Hosting = Path(SearchingExample.parents[2],'hosting/host.txt')
>>> Hosting.parent.mkdir(parents=True, exist_ok = True)
>>> Hosting.touch()
>>> Docker = Path(SearchingExample.parents[1],'Docker/desk.txt')
>>> Docker.parent.mkdir(parents=True, exist_ok = True)
>>> Docker.touch()Мы создали и получили такую структуру (начиная с C:\Users\Blog\Simple-Server):
Cloud
|— Pathlib
| `— file.txt
`— Docker
`— desk.txt
Hosting
`— host.txtИспользование модуля pathlib для поиска файлов подразумевает применение цикла for и метода .glob():
>>> for file_cloud in SearchingExample.parents[2].glob('*.txt'):
print(file_cloud)Этот код не смог ничего найти, так как он не рассматривал вложенные папки. Чтобы он корректно работал, необходимо его немного изменить:
>>> for file_cloud in SearchingExample.parents[2].glob('**/*.txt'):
print(file_cloud)
...
...
C:\Users\Blog\Simple-Server\Cloud\Docker\desk.txt
C:\Users\Blog\Simple-Server\Cloud\Pathlib\file.txt
C:\Users\Blog\Simple-Server\hosting\host.txtНужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.