Работа с файлами и папками сопряжена с некоторыми неудобствами. Но с использованием модуля Pathlib эта задача упрощается. Пользоваться им могут программисты, у которых на компьютере установлен Python 3.4 или позднее. В Pathlib входят лучшие из компонентов файловой системы Python, такие как os, os.path, glob. Подавляющее большинство программ Python взаимодействуют с файловой системой. Соответственно, приходится открывать файлы и папки, изменять их, удалять. Чтобы упростить задачу, используется модуль Pathlib. Рассмотрим его подробнее.
Основные понятия
Перед тем, как начнем рассматривать Pathlib, разберемся в терминах:
1. Путь – нужен, чтобы идентифицировать файл. Он являет собой необязательный набор имен папок. В конце указывается имя и расширение. В функционал Python входит возможность использования абсолютных и относительных путей:
- Абсолютный путь – включает в себя все папки, которые открываются, чтобы получить доступ к файлу.
- Относительный путь – не включает весь маршрут, а начиная с конкретной папки.
2. Расширение – нужно для получения сведений о типе файла.
3. Директория (папка). Технически являет собой запись в файловой системе, в которую включено имя файла, время создания, размер, владелец.
Возможно выполнение следующих операций:
- Создание новых путей из названий.
- Проверка свойств путей.
- Создание файлов и папок, которые находятся по определенному пути.
Применение модуля 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 – объединяет части каталога в целый путь.
Это в совокупности делает код более читабельным.
Но это не все причины, почему полезно использовать Pathlib. Например, вместо использования строкового типа данных для хранения путей, возможно создание отдельного объекта. А он, в свою очередь, имеет ряд методов, позволяющих упростить работу.
Создание и удаление папок
Мы можем использовать стандартный модуль os.path исключительно для манипуляции путями в строчном формате. А для того, чтобы создать директорию, мы используем модуль os. В нем содержится функционал для работы с файлами и каталогами. Например, mkdir, чтобы создать папку, rename для изменения ее имени. Или getsize, чтобы получить ее размер.
Давайте попробуем выполнить ряд этих операций, используя модуль os, а потом сделать аналогичное с помощью модуля Pathlib.
Итак, будет использоваться такой код для работы через модуль os.
if os.path.isdir(path): os.rmdir(path)
Использование объекта path позволяет добиться той же задачи, но используя код, проще для понимания.
if path.is_dir() path.rmdir()
Модуль os не содержит достаточно утилит. А модуль Pathlib решает больший спектр задач, используя методы объектов пути. Чтобы стало понятнее, приведем пример.
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: # Ничего не происходит 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: # Ничего не производится Path_tmp.unlink()
То есть, вместо os.getcwd() используется path.cwd(), а оператор / используется нами для объединения путей на месте os.path.join. Модуль Pathlib позволяет сделать код существенно проще, используя операторы и вызовы метода.
Какие методы используются в Pathlib?
path.cwd() | Позволяет получить путь объекта текущей папки. |
path.home() | Возвращает путь объекта домашней директории. |
path.stat() | Возвращает данные о пути. |
path.chmod() | Изменяет режим и уровень доступа файла. |
path.glob(pattern) | Возвращает файлы, соответствующие определенному шаблону. В качестве такого может выступать, например, *.jpg для получения всех картинок формата Jpeg. |
path.mkdir() | Генерирует папку, расположенную по пути, который передается этому методу. |
path.open() | Запускает файл. |
path.rename() | Изменяет имя файла или папки. |
path.rmdir() | Удаляет папку, не содержащую никаких файлов. |
path.unlink() | Убирает файл или ссылку на него. |
Что такое кроссплатформенные пути и как их генерировать?
В различных операционных системах используются разные соглашения для путей. Так, в Windows это \, в то время как направление косой черты между именами папок в других популярных ОС противоположное – /.
Если вам нужна стабильная работа кода на разных платформах, необходимо обрабатывать эти моменты. И вот модуль Pathlib позволяет упростить эту задачу. Слеш, который используется между папками, будет автоматически заменен на тот, который нужен на конкретной платформе.
pathlib.Path.home() / 'python' / 'samples' / 'test_me.py'
Если возникают другие проблемы, связанные с путями файлов на разных операционных системах, Pathlib с легкостью может их решить.
Как получить данные о пути в Pathlib?
В процессе использования путей нередко надо получить родительскую папку для конкретного элемента или символические ссылки. Класс Path имеет удобный инструментарий для этого, представленный в виде свойств:
- drive: строка, которая представляет название жесткого диска. Например, PureWindowsPath(‘c://Program Files/CSV’).drive вернет C:.
- parts: возвращает компоненты пути.
- name – компонент без директории.
- parent – получение родительских элементов.
- suffix – разрешение файла.
Модуль glob – альтернатива
Помимо модулей os, os.path, есть также glob. Он предоставляет путь связанных утилит. Эта функция нужна, чтобы найти файлы, которые подходят под определенную маску.
from glob import glob top_xlsx_files = glob('*.xlsx') # Все файлы с расширением .xlsx all_xlsx_files = glob('**/*.xlsx', recursive=True)
Pathlib может использоваться в качестве альтернативы, поскольку предоставляет такой же самый функционал.
from pathlib import Path top_xlsx_files = Path.cwd().glob('*.xlsx') all_xlsx_files = Path.cwd().rglob('*.xlsx')
glob тесно связан с объектами Path. Соответственно, модуль Pathlib делает сложные задачи значительно проще.
Чтение и запись файлов
Функционал по чтению и записи файлов реализовывается с помощью таких методов:
- read_text. Чтение содержимого файла.
- read_bytes. Чтение файла в бинарном режиме.
- write_text – внесение изменений в файл в текстовом режиме.
- write_bytes – внесение изменений в файл в бинарном режиме.
Таким образом, функционал модуля Pathlib довольно широкий. Он позволяет выполнять целый спектр задач с файлами и папками на разных операционных системах.