Как указать путь к папке в python
Перейти к содержимому

Как указать путь к папке в python

  • автор:

Работа с каталогами в Python

Каталог — это набор файлов и подкаталогов. Каталог внутри каталога называется подкаталогом. В Python есть модуль os, который предоставляет множество полезных методов для работы с каталогами и файлами.

Текущий каталог в Python

Мы можем вывести текущий каталог с помощью метода getcwd() модуля os . Этот метод возвращает текущий рабочий каталог в виде строки. Например:

Изменение каталога в Python

В Python мы можем изменить текущий рабочий каталог с помощью метода chdir(). Новый путь, который мы хотим использовать, нужно указать при вызове этого метода в виде строки. При этом для разделения элементов пути мы можем использовать как прямую косую черту / , так и обратную косую черту \ . Например:

Список каталогов и файлов в Python

Все файлы и подкаталоги внутри каталога можно получить с помощью метода listdir(). Этот метод принимает путь и возвращает список подкаталогов и файлов по указанному пути.

Если путь не указан, возвращается список подкаталогов и файлов из текущего рабочего каталога.

Почему стоит использовать Pathlib в качестве альтернативы модуля OS

Roman

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

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

В этой статье я опровергну эту практику, представив другую библиотеку управления путями — Pathlib.

Мы посмотрим, как работает эта библиотека, чем она отличается от модуля os.path, какие возможности и преимущества она предоставляет и когда ее следует (или не следует) использовать.

Проблема модуля OS

Модуль os популярен, и он существует уже долгое время. Однако мне всегда казалось, что он обрабатывает пути неестественным образом. Вот причины, которые заставили меня усомниться в использовании этого модуля

  • ОS — большой модуль. В нем, конечно, есть подмодуль path для управления путями и их объединения. Однако если нужно выполнить системные операции с этими путями (создать папку, перечислить содержимое внутри нее или переименовать и удалить файл), то приходится использовать другие методы, которые либо присутствуют где-то еще в иерархии пакетов ( os.makedirs, os.listdir, os.rename и т. д.), либо импортированы из других модулей, таких как shutil или glob . Хорошенько “покопавшись”, вы сможете найти эти методы, но это кажется ненужным усилием.
  • OS представляет пути в их самом грубом формат — строковых значениях. Это сильно ограничивает возможности, так как не дает прямого доступа к такой информации, как свойства файла и его метаданные, и не позволяет выполнять операции с файловой системой путем вызова некоторых специальных методов.
    Например, чтобы проверить, существует ли путь, вы вводите что-то вроде os.path.exists(some_path) . Но не проще ли было бы получить доступ к этой информации непосредственно из объекта path через метод или атрибут класса?
  • Модуль os не позволяет находить пути, соответствующие заданному шаблону, внутри иерархии. Допустим, нужно рекурсивно найти все файлы __init__.py внутри сложной структуры папок. Чтобы сделать это, придется объединить os с другим модулем под названием glob . К этому, конечно, можно привыкнуть, но неужели вам нужно два модуля для выполнения такой задачи?
  • Это скорее вопрос личного предпочтения, но я всегда считал синтаксис os немного громоздким.

Что такое Pathlib?

Pathlib является частью стандартной библиотеки Python. Она была введена в версию Python 3.4 (см. PEP 428) с целью представления путей не в виде простых строк, а в виде многофункциональных объектов Python с множеством полезных методов и атрибутов.

Вот определение из официальной документации:

“Цель этой библиотеки — предоставить простую иерархию классов для работы с путями файловой системы и обычными операциями, которые пользователи выполняют с ними”.

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

Более подробную информацию об этой библиотеке можно найти в официальной документации.

У Pathlib более интуитивно понятный синтаксис

Чтобы создать путь с помощью Pathlib, нужно импортировать класс Path и передать ему строку. Эта строка указывает на путь в файловой системе, который не обязательно должен существовать.

Теперь у вас есть доступ к объекту Path . Как выполнять простые операции?

  • Объединение путей

Pathlib использует оператор / для объединения путей. Сначала эта функция может показаться забавной, но на самом деле она облегчает чтение кода.

Давайте сравним. Чтобы объединить пути с помощью модуля os , нужно сделать примерно следующее:

С Pathlib тот же код будет выглядеть вот так:

По сути, Pathlib усовершенствовал оператор / для выполнения объединения путей.

  • Получение текущего рабочего/ домашнего каталога

Под эту задачу уже предусмотрены методы:

  • Чтение файла

Вы можете либо использовать open с контекстным менеджером, как это делается в случае обычного пути, либо использовать read_text или read_bytes .

Очевидно, что функций у Pathlib гораздо больше. Рассмотрим наиболее интересные из них.

Простое создание файлов и каталогов

После того, как объект Path создан, он может самостоятельно выполнять операции с файловой системой, вызывая свои внутренние методы. Например, объект может создать папку или открыть файл, просто вызвав методы mkdir и touch .

Вот как объект Path создает папку:

Тот же принцип используется и при создании файлов:

Конечно, вы можете выполнить эти операции с помощью модуля os , но для этого необходимо вызвать другую функцию, например makedirs :

Перемещение по иерархии файловой системы с помощью обращения к родителям

Каждый объект Path имеет свойство parent , которое возвращает объект Path родительской папки. Это облегчает работу с большими иерархиями папок. Поскольку Path являются объектами, для доступа к нужному родителю можно использовать цепочку методов:

Чтобы избежать построения цепочки свойств parent для доступа к n-му предыдущему родителю, можно вызвать свойство parents , которое возвращает список всех родителей, предшествующих текущей папке:

Выполнение итераций в каталогах и подгонка под шаблон

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

Помните модуль glob , который импортировался вместе с модулем os , чтобы получить пути, соответствующие шаблону?

Так вот, объекты Path включают метод glob и его рекурсивную версию rglob для выполнения аналогичных задач, но с гораздо более легким синтаксисом.

Допустим, нужно подсчитать количество файлов Python в конкретной папке. Вот как это можно сделать:

Каждый объект Path имеет множество полезных атрибутов

Каждый объект Path имеет множество полезных методов и атрибутов, которые совершают операции, ранее выполнявшиеся другими библиотеками, а не os (например, glob и shutil ).

  • .exists() : проверка наличия пути в файловой системе.
  • .is_dir() : проверка соответствия пути каталогу.
  • .is_file() : проверка соответствия пути файлу.
  • .is_absolute() : проверка абсолютности пути.
  • .chmod() : изменение режима файла и разрешений.
  • is_mount() : проверка того, является ли путь точкой монтирования.
  • .suffix : получение расширение файла.

Это еще не все методы. Вы можете ознакомиться с полным их перечнем здесь.

Это была краткая статья о некоторых возможностях Pathlib. Если вы используете версию Python +3.4 и думаете о переходе на Pathlib, смело делайте это. Переход с os на Pathlib довольно прост.

Python Path — Как использовать модуль Pathlib (с примерами)

В каждой операционной системе существуют свои правила построения путей к файлам. Например, в Linux для путей используются прямые слэши (“/”), а в Windows — обратные слэши (“\”).

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

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

Необходимые условия

Pathlib по умолчанию поставляется с Python >= 3.4. Однако, если вы используете версию Python ниже 3.4, у вас не будет доступа к этому модулю.

Как работает Pathlib?

Чтобы разобраться, как можно построить базовый путь с помощью Pathlib, давайте создадим новый файл Python example.py и поместим его в определенный каталог.

Откройте файл и введите следующее:

В данном примере мы импортируем модуль Pathlib. Затем создаем новую переменную p , чтобы сохранить путь. Здесь мы используем объект Path из Pathlib со встроенной в Python переменной под названием __file__ . Эта переменная служит ссылкой на путь к файлу, в котором мы ее прописываем, а именно, example.py .

Если мы выведем p , то получим путь к файлу, в котором сейчас находимся:

Выше показано, что Pathlib создает путь к этому файлу, помещая этот конкретный скрипт в объект Path. Pathlib содержит множество объектов, таких как PosixPath() и PurePath() , о которых мы узнаем больше в следующих разделах.

Pathlib делит пути файловой системы на два разных класса, которые представляют два типа объектов пути: Pure Path и Concrete Path.

Классы PurePath()

Классы PurePath()

Pure path предоставляет утилиты для обработки пути к файлу и манипулирования им без совершения операций записи, в то время как Concrete path позволяет производить обработку пути к файлу и выполнять операции записи.

Другими словами, Concrete path — это подкласс Pure path. Он наследует манипуляции от родительского класса и добавляет операции ввода/вывода, которые выполняют системные вызовы.

Pure path в Python

Pure path управляет путем к файлу на вашей машине, даже если он принадлежит другой операционной системе.

Допустим, вы работаете в Linux и хотите использовать путь к файлу Windows. Здесь объекты класса Pure path помогут вам обеспечить работу пути на вашей машине с некоторыми базовыми операциями, такими как создание дочерних путей или доступ к отдельным частям пути.

Но Pure path не сможет имитировать некоторые другие операции, такие как создание каталога или файла, потому что вы не находитесь в этой операционной системе.

Как использовать Pure path

Как видно из приведенной выше диаграммы, Pure path состоит из трех классов, которые обрабатывают любой путь к файловой системе на вашем компьютере:

PurePath() — это корневой узел, который обеспечивает операции по обработке каждого объекта пути в Pathlib.

Когда вы инстанцируете PurePath() , он создает два класса для обработки путей Windows и других, отличных от Windows. PurePath() создает общий объект пути «agnostic path», независимо от операционной системы, в которой вы работаете.

PurePath() в приведенном выше примере создает PurePosixPath() , поскольку мы предположили, что работаем на машине Linux. Но если вы создадите его на Windows, то получите что-то вроде PureWindowsPath(‘setup.py’) .

PurePosixPath() — это дочерний узел PurePath(), реализованный для путей файловой системы, отличной от Windows.

Если вы инстанцируете PurePosixPath() в Windows, то не возникнет никакой ошибки, просто потому что этот класс не выполняет системных вызовов.

PureWindowsPath() — это дочерний узел PurePath() , реализованный для путей файловой системы Windows.

То же самое относится и к PureWindowsPath() , поскольку этот класс не предусматривает системных вызовов, следовательно, его инстанцирование не вызовет ошибок для других операционных систем.

Свойства Pure path

Каждый подкласс в PurePath() предоставляет следующие свойства:

PurePath().parent выводит родительский класс:

В примере выше мы используем свойство .parent , чтобы получить путь к логическому родителю main.py .

PurePath().parents[] выводит предков пути:

Вы всегда должны указывать индекс предка в квадратных скобках, как показано выше. В Python 3.10 и выше можно использовать срезы и отрицательные значения индекса.

PurePath().name предоставляет имя последнего компонента вашего пути:

В этом примере конечным компонентом пути является main.py . Таким образом, свойство .name выводит имя файла main.py , то есть main с суффиксом .py.

В свою очередь, PurePath().suffix предоставляет расширение файла последнего компонента вашего пути:

По сравнению со свойством .name , .suffix выводит расширение файла и исключает имя файла.

PurePath().stem выводит только имя конечного компонента вашего пути без суффикса:

Как видно выше, свойство .stem исключает суффикс конечного компонента main.p y и предоставляет только имя файла.

Методы Pure path

Каждый подкласс PurePath() предоставляет следующие методы:

PurePath().is_absolute() проверяет, является ли ваш путь абсолютным или нет:

Обратите внимание, что абсолютный путь состоит из корня и имени диска. В данном случае PurePath() не позволяет нам узнать имя диска.

Если вы используете PureWindowsPath() , то можете репрезентовать абсолютный путь, содержащий имя диска, как PureWindowsPath(‘c:/Program Files’) .

PurePath().is_relative() проверяет, принадлежит ли данный путь другому заданному пути или нет:

В данном примере заданный путь /src является частью или принадлежит пути p , в то время как другой заданный путь /data выдает False , поскольку он не имеет никакого отношения к пути p .

PurePath().joinpath() конкатенирует путь с заданными аргументами (дочерними путями):

Обратите внимание, что нет необходимости добавлять слэши в заданные аргументы, так как метод .joinpath() делает это за вас.

PurePath().match() проверяет, соответствует ли путь заданному шаблону:

Исходя из приведенных примеров, шаблон должен совпадать с путем. Если заданный шаблон является абсолютным, то и путь должен быть абсолютным.

PurePath().with_name() изменяет имя конечного компонента вместе с его суффиксом:

Метод .with_name() не изменяет имя последнего компонента навсегда. Кроме того, если указанный путь не содержит имени, возникает ошибка, как отмечено в официальной документации.

PurePath().with_stem() изменяет только имя последнего компонента пути:

Это аналогично методу .with_name() . Метод .with_stem() изменяет имя последнего компонента на время. Также, если указанный путь не содержит имени, произойдет ошибка.

PurePath().with_suffix() временно изменяет суффикс или расширение последнего компонента пути:

Если имя заданного пути не содержит суффикса, метод .with_suffix() добавляет суффикс за вас:

Но если мы не включим суффикс и оставим аргумент пустым ‘ ‘ , текущий суффикс будет удален.

Некоторые методы, такие как .with_stem() и .is_relative_to() , были недавно добавлены в Python 3.9 и выше. Поэтому, если вы их вызываете, используя Python 3.8 или ниже, будет выдана ошибка атрибута.

Concrete Path в Python

Concrete Paths позволяет обрабатывать, манипулировать и выполнять операции записи над различными путями файловой системы.

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

Как использовать Concrete path

В Concrete path обрабатываются любые пути файловой системы и выполняются системные вызовы на вашем компьютере. Эти объекты пути являются дочерними путями Pure path и состоят из трех подклассов, как и сами Pure path:

Path() — это дочерний узел PurePath() , он обеспечивает операции обработки с возможностью выполнения процесса записи.

Когда вы инстанцируете Path() , он создает два класса для работы с путями Windows и отличных от Windows. Как и PurePath() , Path() также создает общий объект пути «agnostic path», независимо от операционной системы, в которой вы работаете.

Path() в приведенном выше примере создает PosixPath() , поскольку мы предполагаем, что работаем на Linux. Но если вы создадите его в Windows, то получите что-то вроде WindowsPath(‘setup.py’) .

PosixPath() — это дочерний узел Path() и PurePosixPath() , реализованный для обработки и управления путями файловой системы, отличной от Windows.

Вы получите ошибку при инстанцировании PosixPath() на компьютере с Windows, поскольку нельзя выполнять системные вызовы во время работы в другой операционной системе.

WindowsPath() — это дочерний узел Path() и PureWindowsPath() , реализованный для путей файловой системы Windows.

То же самое относится и к WindowsPath() , поскольку вы работаете в другой операционной системе — поэтому ее инстанцирование приведет к ошибке.

Свойства Concrete path

Поскольку Concrete path является подклассом Pure path, вы можете делать с Concrete path все, что угодно, используя свойства PurePath() . Это означает, что мы можем использовать, например, свойство .with_suffix для добавления суффикса к Concrete path:

Или вы можете проверить, относится ли данный путь к исходному пути с помощью .is_relative_to :

Всегда помните, что Concrete path наследуют операции обработки от Pure path и добавляют операции записи, которые выполняют системные вызовы и конфигурации ввода/вывода.

Методы Concrete path

Каждый подкласс Path() предоставляет следующие методы для обработки путей и выполнения системных вызовов:

Path().iterdir() возвращает содержимое каталога. Допустим, у нас есть следующая папка, содержащая следующие файлы:

Чтобы вернуть содержимое каталога /data , вы можете использовать метод .iterdir() :

Метод .itertir() создает итератор, который случайным образом перечисляет файлы.

Path().exists() проверяет, существует ли файл/каталог в текущем пути. Давайте воспользуемся каталогом из предыдущего примера (наш текущий каталог — /data ):

Метод .exists() возвращает True , если заданный файл существует в каталоге data . Метод возвращает False , если его нет.

То же самое относится и к каталогам, метод возвращает True , если заданный каталог существует, и False , если каталог отсутствует.

Path().mkdir() создает новый каталог по заданному пути:

Согласно официальной документации, метод .mkdir() принимает три аргумента. В данный момент мы сосредоточимся только на аргументах parents и exist_ok .

По умолчанию оба аргумента имеют значение False . Аргумент parents выдает ошибку FileNotFound в случае отсутствия родителя, а exist_ok выдает ошибку FileExists, если данный каталог уже существует.

В приведенном примере вы можете установить аргументы в True , чтобы игнорировать упомянутые ошибки и обновить каталог.

Мы также можем создать новый файл по указанному пути с помощью метода Path().touch() :

Та же логика применима к методу .touch() . Здесь параметр exist_ok может быть установлен в True , чтобы игнорировать ошибку FileExists и обновить файл.

Path().rename() переименовывает файл/каталог по заданному пути. Рассмотрим пример на примере нашего каталога /data :

Если вы присваиваете методу несуществующий файл, он выдает ошибку FileNotFound. То же самое относится и к каталогам.

Path().read_text() возвращает содержимое файла в формате строки:

Также вы можете использовать метод write_text() для записи содержимого в файл:

Обратите внимание, что метод .write_text() был добавлен в Python 3.5 и недавно был обновлен в Python 3.10, получив некоторые дополнительные параметры.

Важное замечание

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

Вы правы, если цель состоит в том, чтобы сделать путь, не зависящий от ОС. Но иногда мы не можем этого сделать из-за некоторых параметров, уникальных для Windows или Posix систем. Вот почему предоставляются данные объекты — чтобы помочь разработчикам справиться с такими вариантами использования.

Некоторые пакеты нацелены на решение проблем, присутствующих только в экосистеме Windows, и Python поддерживает эти юзкейсы в данной библиотеке.

Что дальше?

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

Было бы здорово обыграть полученные знания и воплотить их в реальном проекте.

В этой статье я рассказал об основах, необходимых для использования Pathlib в вашем проекте.

В официальной документации описано больше методов и свойств, которые вы можете применить к путям файловой системы: Pathlib — Объектно-ориентированные пути файловой системы

Всех желающих приглашаем на открытое занятие, на котором научимся работать со встроенными модулями. Узнаем про модули (os, pathlib, functools). Регистрация открыта по ссылке.

Как задать путь к файлу в Python?

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

Самый простой вариант — не самый верный!

Внимание! У этого способа обнаружен недостаток!

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

Пример относительного пути:

Где вместо «Files» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.

Пример абсолютного пути:

Где вместо «C:\Python\pythonw.exe\Files\info.txt», «home/my_comp/Files/» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.

Этот вариант рабочий, однако, один существенный недостаток лишил его внимания разработчиков. Проблема заключается в том, что заданные таким способом пути адаптированы только к одному виду операционной системы: к Линукс, либо к Windows, так как в Windows используются обратные слеши «\», а в Линукс — обычные «/». Из-за этого скрипт, показывавший отличные результаты в Windows, начнет жаловаться на отсутствие файлов по прописанному пути в Linux, и наоборот. А с абсолютным путем вообще все сложно: никакого диска «C:» в Линуксе нет. Скрипт опять будет ругаться! Что же делать? Правильно указать путь к файлу!

Указываем путь к файлу правильно!

Внимание! Годный вариант!

Python — умный змей, поэтому в его арсенале, начиная с 3.4 версии появился модуль pathlib, который позволяет вытворять самые приятные вещи с путями к файлу, стоит только импортировать его класс Path:

Кстати, если у вас не установлен модуль pathlib, это легко исправить с помощью команды:

Задаем относительный путь с помощью Path!

После того, как класс импортирован, мы получаем власть над слешами! Теперь вопрос о прямых и обратных слешах в разных операционных системах ложится на плечи Path. Используя Path, вы можете корректно задать относительный путь, который будет работать в разных системах.

Например, в случае расположения файлов, как на представленном изображении, относительный путь, определяемый в скрипте «main_script.py», сформируется автоматически из перечисленных в скобках составных частей. Pathlib инициализирует новый объект класса Path, содержимым которого станет сформированный для Вашей системы относительный путь (в Windows части пути будут разделены обратными слешами, в Linux — обычными):

У нас появился Telegram-канал для изучающих Python! Канал совсем свежий, подпишись одним из первых, ведь вместе «питонить» веселее! �� Ссылка на канал: «Кодим на Python!»

Задаем абсолютный путь с помощью Path
  • cwd() — возвращает путь к рабочей директории
  • home() — возвращает путь к домашней директории

Полученную строку, содержащую путь к рабочей или домашней директории, объединим с недостающими участками пути при инициализации объекта класса Path :

Пример 1: с использованием функции cwd():

В данном случае путь к директории имеет вид: dir_path = «/home/my_comp/python», а полный путь к файлу «docs.txt» будет иметь вид: «/home/my_comp/python/files/info/docs.txt».

Представленный выше код можно оптимизировать и записать в одну строку:

Пример2: с использованием функции home():

В данном случае путь к директории имеет вид: dir_path = «/home/my_comp», а полный путь к файлу ‘docs.txt’ будет иметь вид: «/home/my_comp/files/info/docs.txt».

Сократим представленный выше код:

Подведем итог: начиная с версии Python 3.4, для задания пути к файлу рекомендуется использовать модуль pathlib с классом Path. Определить путь к рабочей директории можно с помощью функции cwd(), а путь к домашней директории подскажет функция home().

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *