- Pathlib — манипуляция путями, создание и удаление папок и файлов
- Содержание статьи
- Концепт пути и директории в Python
- 8.1. Теория¶
- 8.1.1. Файлы и файловая система¶
- 8.1.1.1. Свойства файла¶
- 8.1.1.2. Путь к файлу: абсолютный и относительный¶
- 8.1.1.3. Операции с файлами¶
- 8.1.1.4. Виды файлов¶
- Относительные пути в Python
- 11 ответов
- Составление пути к файлу в Unix и Windows в Python.
- Манипуляции с путями файловой системы средствами pathlib в Python.
- Получение компонентов, сравнение и проверка пути файловой системы.
- Содержание:
- PurePath.parts :
- PurePath.drive :
- PurePath.root :
- PurePath.anchor :
- PurePath.parents :
- PurePath.parent :
- PurePath.name :
- PurePath.suffix :
- PurePath.suffixes :
- PurePath.stem :
- PurePath.as_posix() :
- PurePath.as_uri() :
- PurePath.is_absolute() :
- PurePath.is_reserved() :PureWindowsPath
- PurePath.joinpath(*other) :
- PurePath.match(pattern) :
- PurePath.relative_to(*other) :
- PurePath.with_name(name) :
- PurePath.with_suffix(suffix) :
Pathlib — манипуляция путями, создание и удаление папок и файлов
Модуль Pathlib в Python упрощает работу с файлами и папками. Он доступен в Python 3.4 и более поздних версиях. Pathlib сочетает в себе лучшее из модулей файловой системы Python — os, os.path, glob и так далее.
Содержание статьи
В Python большинство скриптов предполагает работу с файловыми системами. Следовательно, неизбежно взаимодействие с названиями файлов и путями. Именно для этого в Python есть модуль Pathlib, который содержит полезные функции для выполнения задач, связанных с файлами. Pathlib предоставляет удобный для чтения и простой способ создания путей, представляя пути файловой системы в виде надлежащих объектов. Модуль позволяет создавать код, который можно переносить между платформами.
В данной статье мы подробно изучим модуль Pathlib с помощью различных примеров.
Концепт пути и директории в Python
Перед началом подробного рассмотрения модуля Pathlib важно разобраться в разнице между главными концептами темы — путем (path) и директорией (directory).
- Путь используется для идентификации файла. Путь предоставляет необязательную последовательность названий директорий, в конце которой значится конечное имя файла, а также его расширение;
- Расширение названия файла предоставляет некоторую информацию о формате/содержимом файла. Модуль Pathlib может работать как с абсолютными, так и с относительными путями;
- Абсолютный путь начинается с корневой директории и определяет полное дерево каталогов;
- Относительный путь, как следует из названия, является путем к файлу относительно другого файла или директории, обычно текущей;
- Директория представляет собой запись пути в файловой системе и включает название файла, время создания, размер, владельца и так далее.
Модуль Pathlib в Python занимается задачами, связанными с путями, такими как создание новых путей из названий файлов и других путей, проверка различных свойств путей, создание файлов и папок по определенным путям.
8.1. Теория¶
Файлы используются программами для долговременного хранения информации, как необходимой для собственной работы (например, настройки), так и полученной во время ее исполнения (результаты вычислений и т.д.). Подавляющее большинство программ сегодня в том или ином виде используют файлы, сохраняя результаты работы между сеансами запуска.
8.1.1. Файлы и файловая система¶
Файл (англ. File) — именованная область данных на носителе информации.
Файлы хранятся в файловой системе — каталоге, определяющим способ организации, хранения и именования данных, а также задающем ограничения на формат и доступ к данным. На сегодняшний день наиболее популярными являются древовидные каталоги (также директории или папки) — файлы, содержащие записи о входящих в них файлах (Рисунок 8.1.1).
Рисунок 8.1.1 — Пример древовидной организации файловой системы в ОС Windows 6. ¶
Файловая система связывает носитель информации с одной стороны и программный интерфейс для доступа к файлам — с другой. Когда прикладная программа обращается к файлу, она не имеет никакого представления о том, каким образом расположена информация в конкретном файле, так же как и на каком физическом типе носителя (CD, жестком диске, магнитной ленте, блоке флеш-памяти или другом) он записан. Все, что знает программа — это имя файла, его размер и атрибуты (получая их от драйвера файловой системы). Именно файловая система устанавливает, где и как будет записан файл на физическом носителе (например, жестком диске) (Рисунок 8.1.2).
Рисунок 8.1.2 — Файловая система предоставляет интерфейс доступа к файлам для операционной системы 7 ¶
8.1.1.1. Свойства файла¶
Файл может обладать различным набором свойств в зависимости от файловой системы.
В большинстве файловых систем файл имеет следующие свойства:
имя и расширение (как правило, называемые просто именем вместе): например, моя_программа.py ;
дата/время (могут быть предусмотрены маркеры создания, модификации и последнего доступа);
атрибуты (скрытый, системный и др.) и права доступа.
Имя файла имеет определенные ограничения в зависимости от файловой и операционной системы, в частности, допустимые знаки и длину наименования. Расширение указывается после имени через точку, имея назначение, в основном, для ОС Windows, где определяет приложение для запуска файла.
В ОС Windows по умолчанию расширение файла скрыто от пользователя. Зачастую удобно «видеть» расширение, что можно включить в настройках: https://support.microsoft.com/ru-ru/kb/865219.
8.1.1.2. Путь к файлу: абсолютный и относительный¶
Для того, чтобы найти файл в файловой системе необходимо знать к нему путь — узлы дерева файловой системы, которые нужно пройти, чтобы до него добраться.
В операционных системах UNIX разделительным знаком при записи пути является / , в Windows — \ : эти знаки служат для разделения названия каталогов, составляющих путь к файлу.
Путь может быть:
абсолютным (полным): указывает на одно и то же место в файловой системе вне зависимости от текущей рабочей директории или других обстоятельств;
относительным: путь по отношению к текущему рабочему каталогу пользователя или активных приложений.
Примеры путей для ОС Windows и UNIX:
относительный: example1.py если текущий каталог C:\user\python\ ;
относительный: python\example1.py если текущий каталог C:\user\ ;
относительный: example1.py если текущий каталог /home/user/python/ ;
относительный: user/python/example1.py если текущий каталог /home/ .
См. более подробно про пути в разных операционных системах.
8.1.1.3. Операции с файлами¶
Все операции с файлами можно подразделить на 2 группы:
связанные с его открытием: открытие, закрытие файла, запись, чтение, перемещение по файлу и др.
выполняющиеся без его открытия: работа с файлом как элементом файловой системы — переименование, копирование, получение атрибутов и др.
При открытии файла, как правило, указываются:
после чего операционная система возвращает специальный дескриптор файла (идентификатор), однозначно определяющий, с каким файлом далее будут выполняться операции. После открытия доступен файловый указатель — число, определяющее позицию относительно начала файла.
8.1.1.4. Виды файлов¶
По способу организации файлы делятся на файлы с последовательным и произвольным доступом (Рисунок 8.1.3, Таблица 8.1.1).
Рисунок 8.1.3 — Файлы с последовательным и произвольным доступом 8 ¶
Относительные пути в Python
Я создаю простой вспомогательный скрипт для работы, который скопирует пару файлов шаблонов из нашей базы кода в текущий каталог. Однако у меня нет абсолютного пути к каталогу, в котором хранятся шаблоны. У меня есть относительный путь от сценария, но когда я вызываю сценарий, он обрабатывает его как путь относительно текущего рабочего каталога. Есть ли способ указать, что этот относительный URL-адрес от расположения сценария вместо этого?
11 ответов
В файле со сценарием вы хотите сделать что-то вроде этого:
Это даст вам абсолютный путь к файлу, который вы ищете. Обратите внимание, что если вы используете setuptools, вам, вероятно, следует использовать его API ресурсов пакета вместо.
ОБНОВЛЕНИЕ . Я отвечаю на комментарий, чтобы вставить образец кода. 🙂
Правильно ли я считаю, что __file__ не всегда доступен (например, когда вы запускаете файл напрямую, а не импортируете его)?
Я предполагаю, что вы имеете в виду сценарий __main__ , когда упоминаете прямой запуск файла. Если это так, то в моей системе это не так (python 2.5.1 в OS X 10.5.7):
Тем не менее, я знаю, что есть некоторые причуды с __file__ на расширениях C. Например, я могу сделать это на моем Mac:
Тем не менее, это вызывает исключение на моей машине Windows.
Вам нужно os.path.realpath (пример ниже добавляет родительский каталог к вашему пути)
Я не уверен, относится ли это к некоторым более старым версиям, но я считаю, что Python 3.3 имеет встроенную поддержку относительного пути.
Например, следующий код должен создать текстовый файл в той же папке, что и скрипт python:
(обратите внимание, что в начале не должно быть прямой или обратной косой черты, если это относительный путь)
Этот код вернет абсолютный путь к основному сценарию.
Это будет работать даже в модуле.
Как указано в принятом ответе
Я просто хочу добавить, что
последняя строка не может начинаться с обратной косой черты, в действительности ни одна строка не должна включать обратную косую черту
Это должно быть что-то вроде
В некоторых случаях принятый ответ может вводить в заблуждение, см. этот ссылка для деталей
Рассмотрим мой код:
Что сработало для меня, так это использование sys.path.insert . Затем я указал каталог, который мне нужен. Например, мне просто нужно было перейти на один каталог.
См. sys.path. Как инициализируется при запуске программы, первый элемент этого списка, path [0], является каталогом, содержащим скрипт, который использовался для вызова интерпретатора Python.
Используйте этот путь в качестве корневой папки, из которой вы примените свой относительный путь
Как и в принятом ответе, было бы более надежно использовать:
Поскольку использование __file__ вернет файл, из которого был загружен модуль, если он был загружен из файла, поэтому, если файл со сценарием вызывается из другого места, возвращенный каталог будет неправильным.
Альтернатива, которая работает для меня:
Привет, прежде всего вы должны понимать функции os.path.abspath (путь) и os.path.relpath (путь)
Короче говоря, os.path.abspath (path) создает относительный путь к абсолютному пути . И если указанный путь сам по себе является абсолютным, то функция возвращает тот же путь.
Аналогично os.path.relpath (path) создает абсолютный путь к относительному пути . И если предоставленный путь сам является относительным путем, то функция возвращает тот же путь.
Приведенный ниже пример поможет вам правильно понять вышеуказанную концепцию :
Предположим, у меня есть файл input_file_list.txt , который содержит список входных файлов, которые будут обработаны моим скриптом Python.
D : \ конц \ input1.dic
D : \ конц \ input2.dic
D : \ Copyioconc \ input_file_list.txt
Если вы видите вышеупомянутую структуру папок, input_file_list.txt присутствует в папке Copyofconc , а файлы, обрабатываемые скриптом python, находятся в conc . папка
Но содержимое файла input_file_list.txt показано ниже:
А мой скрипт на python присутствует на диске D: .
Относительный путь в файле input_file_list.txt относительно пути к файлу input_file_list.txt .
Поэтому, когда скрипт Python должен выполнить текущий рабочий каталог (используйте os.getcwd () , чтобы получить путь)
Поскольку мой относительный путь относительно input_file_list.txt , то есть «D: \ Copyofconc» , я должен изменить текущий рабочий каталог на «D: \ Copyofconc » .
Поэтому мне нужно использовать os.chdir (‘D: \ Copyofconc’) , поэтому текущий рабочий каталог должен быть «D: \ Copyofconc» .
Теперь, чтобы получить файлы input1.dic и input2.dic , я прочитаю строки «.. \ conc \ input1.dic» и затем воспользуюсь командой
input1_path = os.path.abspath (‘.. \ conc \ input1.dic’) (чтобы изменить относительный путь на абсолютный путь. Здесь текущим рабочим каталогом является «D: \ Copyofconc», файл «. \ conc \ input1.dic» должен быть доступен относительно «D: \ Copyofconc»)
Поэтому input1_path должно быть «D: \ conc \ input1.dic»
Составление пути к файлу в Unix и Windows в Python.
При доступе к файлу в операционной системе требуется правильно указать путь к файлу. Путь к файлу — это строка, которая представляет местоположение файла.
Предупреждение. Сразу оговоримся, чтобы не получить геморрой при составлении путей к файлам с системе Windows используйте встроенный модуль pathlib .
Он разбит на три основные части:
- Путь к файлу /path/to/file/ : расположение директории в файловой системе, где папки разделены прямой косой чертой ‘/’ в Unix подобных системах или обратной косой чертой ‘\’ в Windows.
- Имя файла text : фактическое имя файла.
- Расширение .txt : используется для указания типа файла.
Для чтения или записи в файл нам необходимо его открыть, а для этого нужно передать путь к нужному файлу в качестве строки функции open() . Для Unix подобных систем это делается просто:
В системе Windows путь включает в себя обратную косую черту ‘\’ . Этот символ в строках на Python используется для экранирования escape-последовательностей, таких как новая строка ‘\n’ .
Что бы избежать Windows системах такого безобразия, нам нужно вручную экранировать обратную косую черту ‘\\’ или передавать в функции open() сырую (необработанную) строку, указав перед первой кавычкой строковой литерал ‘r’ :
А вот как просто создавать и использовать пути при помощи встроенного модуля pathlib . Так как модуль встроенный, то устанавливать ничего не надо.
Строковое представление пути можно посмотреть функцией str() — это сам необработанный путь к файловой системе в собственном виде, например с обратным слешем в Windows, который можно передать любой функции, принимающей путь к файлу в виде строки:
Переводить путь в текстовое представление не обязательно, т.к. объект пути модуля pathlib принимают все функции.
Манипуляции с путями файловой системы средствами pathlib в Python.
Получение компонентов, сравнение и проверка пути файловой системы.
Описанные ниже свойства и методы позволяют легко манипулировать с путями файловой системы без осуществления системных вызовов.
Данные методы принадлежат экземпляру, созданному из класса PurePath() , стандартного модуля pathlib .
Содержание:
PurePath.parts :
Свойство PurePath.parts возвращает кортеж, дающее доступ к отдельным частям/компонентам пути. Полученный кортеж представляет собой последовательность сегментов пути, проанализированных на основе значения разделителя пути.
Обратите внимание, как диск и локальный корень перегруппированы в одну часть.
PurePath.drive :
Свойство PurePath.drive возвращает строку, представляющую букву или имя диска, если есть:
Расширения UNC также считаются дисками:
PurePath.root :
Свойство PurePath.root возвращает строку, представляющую локальный или глобальный корень, если есть:
У UNC расширения тоже всегда есть корень:
PurePath.anchor :
Свойство PurePath.anchor возвращает строку, представляющую конкатенацию диска и корня:
PurePath.parents :
Свойство PurePath.parents представляет собой неизменную последовательность, обеспечивающую доступ к логическим предкам пути:
PurePath.parent :
Свойство PurePath.parent возвращает строку, представляющую логический родительский путь:
Свойство не позволяет пройти мимо корневой директории или пустого пути:
Заметка. Это чисто лексическая операция, отсюда и следующее поведение:
Если необходимо вычислить произвольный путь файловой системы вверх, рекомендуется сначала вызвать Path.resolve() , чтобы разрешить символические ссылки и исключить компоненты ‘..’ .
PurePath.name :
Свойство PurePath.name возвращает строку, представляющую конечный компонент пути, исключая диск и корень, если есть. Другими словами это имя файла или название последней директории в пути.
Имена дисков UNC не учитываются:
PurePath.suffix :
Свойство PurePath.suffix возвращает строку, представляющую расширение файла, если есть:
PurePath.suffixes :
Свойство PurePath.suffixes возвращает список, представляющий расширения файла, если есть:
PurePath.stem :
Свойство PurePath.stem возвращает строку, представляющую последний компонент пути без суффикса:
PurePath.as_posix() :
Метод PurePath.as_posix() возвращает строковое представление пути с косыми чертами ‘/’ :
PurePath.as_uri() :
Метод PurePath.as_uri() возвращает строку, представляющую путь как file URI. если путь не абсолютен, то поднимается исключение ValueError .
PurePath.is_absolute() :
Метод PurePath.is_absolute() проверяет, является ли путь абсолютным или нет. Возвращает True , если путь считается абсолютным. Путь считается абсолютным, если он имеет как корень так и диск, если это позволяет файловая система:
PurePath.is_reserved() :PureWindowsPath
Метод PurePath.is_reserved() c pathlib.PureWindowsPath возвращает True , если путь считается зарезервированным под Windows и False противном случае. С pathlib.PurePosixPath , всегда возвращает False .
Вызовы файловой системы на зарезервированных путях под Windows могут таинственно завершаться сбоем или иметь непредвиденные последствия.
PurePath.joinpath(*other) :
Метод PurePath.joinpath() объединяет исходный путь с каждым из аргументов other по очереди:
PurePath.match(pattern) :
Метод PurePath.match() сравнивает исходный путь с предоставленным шаблоном pattern в стиле модуля glob . Метод PurePath.match вернет True если сопоставление прошло успешно и False в противном случае.
Если шаблон pattern должен быть относительным по отношению к сравниваемому пути. Сравниваемый путь может быть как относительным так и абсолютным, а сопоставление выполняется справа:
Если шаблон pattern является абсолютным, то и путь должен быть абсолютным и весь путь должен совпадать:
Как и с другими методами, в Windows чувствительность к регистру не соблюдается:
PurePath.relative_to(*other) :
Метод PurePath.relative_to() вычисляет версию исходного пути относительно переданного в качестве аргумента пути other . Если это невозможно, то поднимается исключение ValueError :
PurePath.with_name(name) :
Метод PurePath.with_name() возвращает новый объект пути с измененным name . Если исходный путь не имеет имени name , вызывается исключение ValueError :
PurePath.with_suffix(suffix) :
Метод PurePath.with_suffix() возвращает новый объект пути с измененным suffix . Если исходный путь не имеет расширения suffix , то к окончанию пути тупо добавляется переданный suffix .
Если суффикс suffix=» — является пустой строкой, исходный суффикс удаляется: