Обрезать путь к файлу python

Обновлено: 30.06.2024

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

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

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

Модуль встроенный, поэтому для работы с ним не нужно ничего устанавливать.

Вывод текущей директории

Для получения текущего рабочего каталога используется os.getcwd() :

os.getcwd() возвращает строку в Юникоде, представляющую текущий рабочий каталог. Вот пример вывода:

Создание папки

Для создания папки/каталога в любой операционной системе нужна следующая команда:

После ее выполнения в текущем рабочем каталоге тут же появится новая папка с названием «folder».

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

Функция os.path.isdir() вернет True , если переданное имя ссылается на существующий каталог.

Изменение директории

Менять директории довольно просто. Проделаем это с только что созданным:

Еще раз выведем рабочий каталог:

Создание вложенных папок

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

Это создаст три папки рекурсивно, как показано на следующем изображении:

Создание вложенных папок

Создание файлов

Для создания файлов в Python модули не нужны. Можно использовать встроенную функцию open() . Она принимает название файла, который необходимо создать в качестве первого параметра и желаемый режим открытия — как второй:

w значит write (запись), a — это appending (добавление данных к уже существующему файлу), а r — reading (чтение). Больше о режимах открытия можно почитать здесь.

Переименование файлов

С помощью модуля os достаточно просто переименовать файл. Поменяем название созданного в прошлом шаге.


Содержание статьи

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

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

Концепт пути и директории в Python

  • Путь используется для идентификации файла. Путь предоставляет необязательную последовательность названий директорий, в конце которой значится конечное имя файла, а также его расширение;
  • Расширение названия файла предоставляет некоторую информацию о формате/содержимом файла. Модуль Pathlib может работать как с абсолютными, так и с относительными путями;
  • Абсолютный путь начинается с корневой директории и определяет полное дерево каталогов;
  • Относительный путь, как следует из названия, является путем к файлу относительно другого файла или директории, обычно текущей;
  • Директория представляет собой запись пути в файловой системе и включает название файла, время создания, размер, владельца и так далее.

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

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Как использовать модуль Pathlib?

Для работы с Pathlib в Python требуется импортировать все классы данного модуля, используя следующую команду:

В качестве первого задания давайте извлечем текущую рабочую директорию и домашнюю директорию объектов, используя следующий код:

Вместо импорта всех классов можно использовать import pathlib . В таком случае, задействуя классы внутри модуля, требуется добавлять через pathlib .

Зачем использовать модуль Pathlib?

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

Допустим, мы хотим создать файл под названием "output/output.xlsx" в текущем рабочем каталоге. Следующий код пытается сделать это с помощью модуля os.path . Также используются функции os.getcwd и os.path.join .

outpath_file = os . pathjoin ( os.path . join ( os . getcwd ( ) , 'output' ) , "out.xlsx" )

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

Данный код можно переписать, используя модуль Pathlib:

Такой формат проще укладывается в голове. В Pathlib функция Path.cwd() используется для получения текущего рабочего каталога, а оператор / используется вместо os.path.join для объединения частей пути в составной объект пути.

Шаблон вложенности функций в модуле os.path заменяется классом Path модуля Pathlib, что представляет путь через объединение методов и атрибутов. Умная перегрузка оператора / делает код читабельным и простым в обращении.

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

Создание и удаление папок через Pathlib

Классический модуль os.path используется только для манипуляции строками пути. Чтобы что-то сделать с путем, например, создать директорию, нам нужен модуль os . Модуль os предоставляет набор функций для работы с файлами и каталогами, например: mkdir для создания директории, rename для переименования, а getsize для получения ее размера.

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

Пример кода, написанный с использованием модуля os :

Если мы используем объекты path модуля Pathlib для достижения той же функциональности, конечный код будет читабельнее и легче для понимания:

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

outpath_tmp = os.path . join ( os . getcwd ( ) , 'output.tmp' )

Здесь функция generate_data() принимает путь к файлу в качестве параметра и записывает данные в другой путь. Однако, если файл, который передается в качестве параметра, не изменяется, так как в последний раз была выполнена функция generate_data() , генерируется пустой файл. В этом случае пустой файл заменяется предыдущей версией файла.

Исходный код: Lib/posixpath.py (для POSIX) и Lib/ntpath.py (для Windows NT).

Модуль реализует некоторые полезные функции для имён путей. Для чтения или записи файлов см. open() , а для доступа к файловой системе см. модуль os . Параметры пути могут передаваться в виде строк или байтов. Приложениям рекомендуется представлять имена файлов в виде Юникод строк. К сожалению, некоторые имена файлов не могут быть представлены в виде строк в Unix, поэтому приложения, которым необходимо поддерживать произвольные имена файлов в Unix, должны использовать байтовые объекты для представления имён путей. И наоборот, использование байтовых объектов не может представлять все имена файлов в Windows (в стандартной кодировке mbcs ), поэтому приложения Windows должны использовать строковые объекты для доступа ко всем файлам.

В отличие от оболочки Unix, Python не выполняет никаких автоматических расширений пути. Такие функции, как expanduser() и expandvars() , могут вызваться явно, когда приложению требуется расширение пути, подобное оболочке. (См. также модуль glob .)

Модуль pathlib предлагает высокоуровневые объекты пути.

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

Поскольку у разных операционных систем разные соглашения об именах путей, в стандартной библиотеке есть несколько версий данного модуля. Модуль os.path всегда является модулем пути, подходящим для операционной системы, в которой работает Python, и, следовательно, может использоваться для локальных путей. Однако вы также можете импортировать и использовать отдельные модули, если хотите управлять путём, который всегда является в одном из различных форматов. У следующих модулей одинаковый интерфейс:

  • posixpath для путей в стиле UNIX
  • ntpath для путей Windows

Изменено в версии 3.8: exists() , lexists() , isdir() , isfile() , islink() и ismount() теперь возвращают False вместо того, чтобы вызывать исключение для путей, содержащих символы или байты, непредставимые на уровне ОС.

Возвращает нормализованную абсолютизированную версию пути path. На большинстве платформ эквивалентно вызову функции normpath() следующим образом: normpath(join(os.getcwd(), path)) .

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает базовое имя пути path. Второй элемент пары, возвращаемой при передаче path функции split() . Обратите внимание, что результат этой функции отличается от результата программы Unix basename; где basename для '/foo/bar/' возвращает 'bar' , функция basename() возвращает пустую строку ( '' ).

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает самый длинный общий подпуть каждого пути в последовательности paths. Поднимает ValueError , если paths содержит как абсолютные, так и относительные пути, paths находится на разных дисках или если paths пуст. В отличие от commonprefix() , возвращает действительный путь.

Добавлено в версии 3.5.

Изменено в версии 3.6: Принимает последовательность путеподобных объектов .

Возвращает префикс самого длинного пути (посимвольно), который является префиксом всех путей в list. Если list пуст, возвращает пустую строку ( '' ).

Функция может возвращать недопустимые пути, потому что работает по символу за раз. Чтобы получить действительный путь, см. commonpath() .

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает имя каталога пути path. Первый элемент пары, возвращаемой при передаче path функции split() .

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает True , если path относится к существующему пути или дескриптору открытого файла. Возвращает False для неработающих символических ссылок. На некоторых платформах функция может возвращать False , если не предоставлено разрешение на выполнение os.stat() в запрошенном файле, даже если path физически существует.

Изменено в версии 3.3: path теперь может быть целым числом: возвращается True , если дескриптор открытого файла, в противном случае — False .

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает True , если path относится к существующему пути. Возвращает True для неработающих символических ссылок. Эквивалентен exists() на платформах без os.lstat() .

Изменено в версии 3.6: Принимает путеподобный объект .

В Unix и Windows вернуть аргумент, заменив начальный компонент

user на домашний каталог данного user.

В Unix начальный

заменяется переменной среды HOME , если она установлена; в противном случае домашний каталог текущего пользователя ищется в каталоге паролей с помощью встроенного модуля pwd . Начальный

user ищется непосредственно в каталоге паролей.

В Windows будет использоваться USERPROFILE , если он установлен, в противном случае будет использоваться комбинация HOMEPATH и HOMEDRIVE . Первоначальный

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

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

Изменено в версии 3.6: Принимает путеподобный объект .

Изменено в версии 3.8: Больше не использует HOME в Windows.

Возвращает аргумент с расширенными переменными среды. Подстроки вида $name или $ заменяются значением переменной окружения name. Неправильные имена переменных и ссылки на несуществующие переменные остаются без изменений.

В Windows поддерживаются расширения %name% в дополнение к $name и $ .

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает время последнего доступа path. Возвращаемое значение — число с плавающей запятой, дающее количество секунд с начала эпохи (см. модуль time ). Поднимает OSError , если файл не существует или недоступен.

os.path. getmtime ( path ) ¶

Возвращает время последней модификации path. Возвращаемое значение — число с плавающей запятой, представляющее количество секунд с начала эпохи (см. модуль time ). Поднимает OSError , если файл не существует или недоступен.

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает ctime системы, который в некоторых системах (например, Unix) является временем последнего изменения метаданных, а в других (например, Windows) — временем создания path. Возвращаемое значение — число, указывающее количество секунд с начала эпохи (см. модуль time ). Поднимает OSError , если файл не существует или недоступен.

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает размер path в байтах. Поднимает OSError , если файл не существует или недоступен.

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает True , если path — абсолютный путь. В Unix это означает, что он начинается с косой черты, в Windows — с косой черты (обратной) после удаления потенциальной буквы диска.

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает True , если path является обычным файлом existing . Следует за символическими ссылками, поэтому и islink() , и isfile() могут быть верными для одного и того же пути.

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает True , если path — каталог существует . Следует за символическими ссылками, поэтому и islink() , и isdir() могут быть верными для одного и того же пути.

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает True , если path относится к записи существующего каталога, которая является символической ссылкой. Всегда False , если символические ссылки не поддерживаются средой выполнения Python.

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает True , если путь pathточка монтирования: точка в файловой системе, где была смонтирована другая файловая система. В POSIX функция проверяет, находится ли родительский элемент path, path /.. , на другом устройстве, чем path, или же path /.. и path указывают на один и тот же i-node на том же устройстве, — должно определять точки монтирования для всех вариантов Unix и POSIX. Функция не может надежно обнаружить монтирование привязки в одной и той же файловой системе. В Windows корень с буквой диска и общий UNC-файл всегда являются точками монтирования, а для любого другого пути вызывается GetVolumePathName , чтобы узнать, отличается ли он от входного пути.

Добавлено в версии 3.4: Поддержка определения точек монтирования без полномочий root в Windows.

Изменено в версии 3.6: Принимает путеподобный объект .

Разумно соединить один или несколько компонентов пути. Возвращаемое значение представляет собой конкатенацию path и любых элементов *paths с ровно одним разделителем каталогов ( os.sep ), следующим за каждой непустой частью, кроме последней, что означает, что результат будет заканчиваться разделителем только в том случае, если последняя часть пуста. Если компонент является абсолютным путём, все предыдущие компоненты отбрасываются, и соединение продолжается с компонента абсолютного пути.

В Windows буква диска не сбрасывается при обнаружении компонента абсолютного пути (например, r'\foo' ). Если компонент содержит букву диска, все предыдущие компоненты отбрасываются, а буква диска сбрасывается. Обратите внимание, что для каждого диска существует текущий каталог, os.path.join("c:", "foo") представляет путь относительно текущего каталога на диске C: ( c:foo ), а не c:\foo .

Изменено в версии 3.6: Принимает путеподобный объект для path и paths.

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

Изменено в версии 3.6: Принимает путеподобный объект .

Нормализовать имя пути, свернув избыточные разделители и ссылки верхнего уровня, чтобы A//B , A/B/ , A/./B и A/foo/../B превратились в A/B . Манипуляция со строкой может изменить значение пути, содержащего символические ссылки. В Windows преобразует косую черту в обратную косую черту. Чтобы нормализовать регистр, используйте normcase() .

Изменено в версии 3.6: Принимает путеподобный объект .

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

Когда происходят циклы символьных ссылок, возвращаемый путь будет одним из элементов цикла, но не даётся никаких гарантий относительно того, какой из них именно будет.

Изменено в версии 3.6: Принимает путеподобный объект .

Изменено в версии 3.8: Символические ссылки и переходы теперь разрешены в Windows.

Возвращает относительный путь к файлу path либо из текущего каталога, либо из необязательного каталога start. Это вычисление пути: у файловой системы нет доступа, чтобы подтвердить существование или характер path или start.

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает True , если оба аргумента имени пути относятся к одному и тому же файлу или каталогу. Определяется номером устройства и номером i-node и вызывает исключение в случае сбоя вызова os.stat() по любому имени пути.

Изменено в версии 3.2: Добавлена поддержка Windows.

Изменено в версии 3.4: Windows теперь использует ту же реализацию, что и все другие платформы.

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает True , если файловые дескрипторы fp1 и fp2 относятся к одному и тому же файлу.

Изменено в версии 3.2: Добавлена поддержка Windows.

Изменено в версии 3.6: Принимает путеподобный объект .

Возвращает True , если кортежи статистики stat1 и stat2 относятся к одному и тому же файлу. Структуры могут возвращаться os.fstat() , os.lstat() или os.stat() . Функция реализует базовое сравнение, используемое samefile() и sameopenfile() .

Изменено в версии 3.4: Добавлена поддержка Windows.

Изменено в версии 3.6: Принимает путеподобный объект .

Разделите имя пути path на пару, (head, tail) , где tail — последний компонент имени пути, а head — всё, что ведёт к нему. Часть tail никогда не будет содержать косую черту; если path заканчивается косой чертой, tail будет пустым. Если в path нет косой черты, head будет пустым. Если path пусто, то и head, и tail пусты. Завершающие косые черты удаляются из head, если он не является корневым (только одна или несколько косых черт). Во всех случаях join(head, tail) возвращает путь к тому же местоположению, что и path (но строки могут отличаться). См. также функции dirname() и basename() .

Изменено в версии 3.6: Принимает путеподобный объект .

Разделить путь path на пару (drive, tail) , где drive — либо точка монтирования, либо пустая строка. В системах, которые не используют спецификации дисков, drive всегда будет пустой строкой. Во всех случаях drive + tail будет таким же, как path.

В Windows разделяет имя пути на диск/UNC точку обмена и относительный путь.

Если путь содержит букву диска, диск будет содержать всё до двоеточия включительно. Например splitdrive("c:/dir") возвращает ("c:", "/dir")

Если путь содержит путь UNC, диск будет содержать имя хоста и общий ресурс до четвертого разделителя, но не включая его. например splitdrive("//host/computer/dir") возвращает ("//host/computer", "/dir")

Изменено в версии 3.6: Принимает путеподобный объект .

Разделить путь path на пару (root, ext) так, чтобы root + ext == path и ext были пустыми или начинались с точки и содержали не более одной точки. Начальные точки в базовом имени игнорируются; splitext('.cshrc') возвращает ('.cshrc', '') .

Изменено в версии 3.6: Принимает путеподобный объект .

True , если в качестве имён файлов могут использоваться произвольные Юникод строки (в пределах ограничений, накладываемых файловой системой).

Модуль стандартной библиотеки os (от «operation system») предоставляет множество полезных функций для произведения системных вызовов. Одна из базовых функций этого модуля — os.listdir .

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

Модуль os содержит подмодуль os.path , который позволяет работать с путями файлов и папок. Импортировать этот модуль отдельно не нужно, достаточно выполнить import os .

Присоединение одной части пути к другой

Работа с путями к файлам и папкам как с простыми строками чревата множеством ошибок и может создать проблемы при переносе программы между различными операционными системами. Правильный путь объединить две части пути — это использование os.path.join :

Извлечение имени файла из пути

Функция os.path.split совершает обратное действие — отрезает имя файла или ниже лежащей папки от пути:

Извлечение расширения

Кроме того, может пригодиться функция os.path.splitext , котоая отрезает расширение файла:

Проверка типа файла

Кроме прочего, модуль os.path содержит функции для проверки существования файла и для определения его типа:

Производите все манипуляции с файлами с осторожностью, придерживайтесь правила «семь раз отмерь — один раз отрежь». Не забывайте программно производить все возможные проверки перед выполнением операций.

Создание файла

Нет ничего проще, чем создать пустой файл, достаточно открыть несуществующий файл с флагом 'x' :

Конечно, можно было бы использовать флаг 'w' , но тогда уже существующий файл был бы стёрт. С флагом 'x' open либо создаст новый файл, либо выбросит ошибку.

Создание папки

Для создания новой папки используйте os.mkdir(name) . Эта функция выбросит ошибку, если по указанному пути уже существует файл или папка. Если вам нужно создать сразу несколько вложенных папок, то смотрите функцию os.makedirs(name, exist_ok=False) .

Перемещение и переименование

Для удобной манипуляции с файлами и папками в стандартной библиотеки Python существует специальный модуль shutil . Функция shutil.move(source, destination) позволяет вам переместить любой файл или папку (даже непустую). Обратите внимание, что если destination — это уже существующая папка, то файл/папка будет перемещена внутрь неё, в остальных случаях файл/папка будут скопированы точно по нужному адресу. В случае успеха, функция вернёт новое местоположение файла. Если destination существует и не является папкой, то будет выброшена ошибка.

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

Копирование

Скопировать файл можно с помощью функции shutil.copy(source, destination) . Правила расположения копии будут те же, что и при использовании shutil.move , за тем исключением, что если destination существует и не является файлом, то он будет заменён и ошибки это не вызовет.

Скопировать папку для операционной системы сложнее, ведь мы всегда хотим скопировать не только папку, но и её содержимое. Для копирования папок используйте shutil.copytree(source, destination) . Обратите внимание, что для этой функции destination всегда должно быть путём конечного расположения файлов и не может быть уже существующей папкой.

Удаление

Удалить файл можно с помощью функции os.remove , а пустую папку с помощью функции os.rmdir .

А вот для удаления папки с содержимым вновь понадобится shutil . Для удаления такой папки используйте shutil.rmtree .

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

  1. В текущей папке лежат файлы с расширениями .mp3 , .flac и .oga . Создайте папки mp3 , flac , oga и положите туда все файлы с соответствующими расширениями.
  2. В текущей папке лежит две других папки: vasya и mila , причём в этих папках могут лежать файлы с одинаковыми именами, например vasya/kursovaya.doc и mila/kursovaya.doc . Скопируйте все файлы из этих папок в текущую папку назвав их следующим образом: vasya_kursovaya.doc , mila_test.pdf и т.п.
  3. В текущей папке лежат файлы следующего вида: S01E01.mkv , S01E02.mkv , S02E01.mkv и т.п., то есть все файлы начинаются с S01 или S02 . Создайте папки S01 и S02 и переложите туда соответствующие файлы.
  4. В текущей папке лежат файлы вида 2019-03-08.jpg , 2019-04-01.jpg и т.п. Отсортируйте файлы по имени и переименуйте их в 1.jpg , 2.jpg , …, 10.jpg , и т.д.
  5. В текущей папке лежат две другие папки: video и sub . Создайте новую папку watch_me и переложите туда содержимое указанных папок (сами папки класть не надо).
  6. В текущей папке лежат файлы типа Nina_Stoletova.jpg , Misha_Perelman.jpg и т.п. Переименуйте их переставив имя и фамилию местами.
  7. В текущей папке лежит файл list.tsv , в котором с новой строки написаны имена некоторых других файлов этой папки. Создайте папку list и переложите в неё данные файлы.

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

А почему не os.path.join?

Казалось бы, ничего сложного. Однако, зачем громоздить лишние скобки, когда есть более лаконичный вариант с использованием модуля pathlib?

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

Читайте также: