Модуль os.path
os.path является вложенным модулем в модуль os, и реализует некоторые полезные функции для работы с путями.
os.path.abspath(path) — возвращает нормализованный абсолютный путь.
os.path.basename(path) — базовое имя пути (эквивалентно os.path.split(path)[1]).
os.path.commonprefix(list) — возвращает самый длинный префикс всех путей в списке.
os.path.dirname(path) — возвращает имя директории пути path.
os.path.exists(path) — возвращает True, если path указывает на существующий путь или дескриптор открытого файла.
os.path.expanduser(path) — заменяет ~ или ~user на домашнюю директорию пользователя.
os.path.expandvars(path) — возвращает аргумент с подставленными переменными окружения ($name или $ заменяются переменной окружения name). Несуществующие имена не заменяет. На Windows также заменяет %name%.
os.path.getatime(path) — время последнего доступа к файлу, в секундах.
os.path.getmtime(path) — время последнего изменения файла, в секундах.
os.path.getctime(path) — время создания файла (Windows), время последнего изменения файла (Unix).
os.path.getsize(path) — размер файла в байтах.
os.path.isabs(path) — является ли путь абсолютным.
os.path.isfile(path) — является ли путь файлом.
os.path.isdir(path) — является ли путь директорией.
os.path.islink(path) — является ли путь символической ссылкой.
os.path.ismount(path) — является ли путь точкой монтирования.
os.path.join(path1[, path2[, . ]]) — соединяет пути с учётом особенностей операционной системы.
os.path.normcase(path) — нормализует регистр пути (на файловых системах, не учитывающих регистр, приводит путь к нижнему регистру).
os.path.normpath(path) — нормализует путь, убирая избыточные разделители и ссылки на предыдущие директории. На Windows преобразует прямые слеши в обратные.
os.path.realpath(path) — возвращает канонический путь, убирая все символические ссылки (если они поддерживаются).
os.path.relpath(path, start=None) — вычисляет путь относительно директории start (по умолчанию — относительно текущей директории).
os.path.samefile(path1, path2) — указывают ли path1 и path2 на один и тот же файл или директорию.
os.path.sameopenfile(fp1, fp2) — указывают ли дескрипторы fp1 и fp2 на один и тот же открытый файл.
os.path.split(path) — разбивает путь на кортеж (голова, хвост), где хвост — последний компонент пути, а голова — всё остальное. Хвост никогда не начинается со слеша (если путь заканчивается слешем, то хвост пустой). Если слешей в пути нет, то пустой будет голова.
os.path.splitdrive(path) — разбивает путь на пару (привод, хвост).
os.path.splitext(path) — разбивает путь на пару (root, ext), где ext начинается с точки и содержит не более одной точки.
os.path.supports_unicode_filenames — поддерживает ли файловая система Unicode.
Для вставки кода на Python в комментарий заключайте его в теги
Как получить полный путь к файлу или программе Windows? Python
Как получить полный путь к файлу или программе в Windows, для его/ее дальнейшего открытия с помощью subprocess?
Отслеживать
задан 13 янв 2020 в 20:23
265 5 5 серебряных знаков 13 13 бронзовых знаков
можете уточнить суть вопроса и привести примеры? что вам известно о файле / программе ?
13 янв 2020 в 20:24
@MaxU, у меня есть приложение, возьмём условный Google Chrome. На вход функции нужно дать имя программы, а на выходе получить полный путь к ней. Возможно ли это сделать?
13 янв 2020 в 20:31
путь к этой программе прописан в переменной окружения PATH ?
13 янв 2020 в 20:32
@MaxU, нет. Нужно добавить?
13 янв 2020 в 20:35
я не просто так попросил уточнить вопрос. Если это программа которая открывает определенный тип файлов по умолчанию в Windows, то данную информацию можно найти в реестре Windows. Если к данной программе прописан путь в переменной PATH - тоже можно найти. В противном случае придется искать данный файл во всех папках всех доступных дисков - это ОЧЕНЬ медленно
Путь, имя и расширение файла
Достаточно часто возникают ситуации, когда у нас есть полное имя файла, а требуется узнать его расширение. Или добавить нужное расширение, когда не известно, ввел его пользователь или нет. Иногда у нас есть относительный путь до файла, а требуется узнать абсолютный. Про основные методы работы с именем файла и будет эта статья.
Абсолютный путь к файлу
Для того чтобы узнать в Python абсолютный путь к файлу, потребуется воспользоваться библиотекой os. Её подключаем с помощью команды import os. В классе path есть метод abspath. Вот пример использования.
import os p = os.path.abspath('file.txt ') print(p) C:\python3\file.txt
Так же можно воспользоваться и стандартной библиотекой pathlib. Она вошла в состав основных библиотек, начиная с версии Python 3.4. До этого надо было ее инсталлировать с помощью команды pip install pathlib. Она предназначена для работы с путями файловой системы в разных ОС и отлично подойдет для решения данной задачи.
import pathlib p = pathlib.Path('file.txt ') print(p) C:\python3\file.txt
Имя файла
Чтобы узнать имя файла из полной строки с путем, воспользуемся методом basename модуля os.
import os name = os.path.basename(r'C:\python3\file.txt ') print(name) file.txt
Здесь перед строкой вставил r, чтобы подавить возможное возникновение служебных символов. Например, в данном случае если не указать r, то \f считалось бы символом перевода страницы.
Без расширения
Теперь разберемся, как в Python узнать имя файла без расширения. Воспользуемся методом splittext. В этот раз для примера возьмем файл с двойным расширением, чтобы проверить, как будут в этой ситуации работать стандартны функции.
from os import path full_name = path.basename(r'C:\python3\file.tar.gz ') name = path.splitext(full_name)[0] print(name) file.tar
Видно, что последнее расширение архиватора gz было отброшено, в то время как расширение несжатого архива tar осталось в имени.
Если же нам нужно только имя, то можно отбросить все символы полученной строки, которые идут после первой точки. Символ точки тоже отбросим.
Дополним предыдущий пример следующим кодом:
index = name.index('.') print(name[:index]) file
Расширение файла
В Python получить расширение файла можно аналогичным образом с помощью той же функции splitext. Она возвращает кортеж. Первый элемент кортежа имя, а второй – расширение. В данном случае нам нужен второй элемент. Индекс второго элемента равен единице, так как отсчет их идет от нуля.
from os import path full_name = path.basename(r'C:\python3\file.tar.gz ') name = path.splitext(full_name)[1] print(name) .gz
Аналогично можно воспользоваться библиотекой pathlib. Воспользуемся методом suffix.
from pathlib import Path print(Path(r'C:\python3\file.tar.gz ').suffix) .gz
Но в нашем случае два расширения. Их можно узнать с помощью функции suffixes. Она возвращает список, элементами которого и будут расширения. Ниже приведен пример получения списка расширений.
from pathlib import Path print(Path(r'C:\python3\file.tar.gz ').suffixes) ['.tar', '.gz ']
Для того, чтобы получить имя файла или расширение из полного пути или для получения абсолютного пути к файлу используйте библиотеки os и pathlib. Лучше воспользоваться готовым решением из стандартой библиотеками, чем писать свое решение.
Как узнать путь к файлу python
На этом шаге мы рассмотрим особенности открытия файла, определения текущего каталога .
Очень часто нужно сохранить какие-либо данные. Для этого существуют два способа: запись в файл и сохранение в базу данных . Первый способ используется при сохранении информации небольшого объема. Если объем велик, то лучше (и удобнее) воспользоваться базой данных.
Открытие файла
Прежде чем работать с файлом, необходимо создать объект файла с помощью функции open () . Функция имеет следующий формат:
open(Путь к файлу>[, mode = 'r'] [, buffering=-1] [, encoding=None] [, errors=None][, newline=None][, closefd=True])
В первом параметре указывается путь к файлу. Путь может быть абсолютным или относительным. При указании абсолютного пути в Windows следует учитывать, что в Python слеш является специальным символом. По этой причине слеш необходимо удваивать или вместо обычных строк использовать неформатированные строки. Пример:
>>> "C:\\temp\\new\\file.txt" # Правильно 'C:\\temp\\new\\file.txt' >>> r"C:\temp\new\file.txt" # Правильно 'C:\\temp\\new\\file.txt' >>> "C:\temp\new\file.txt" # Неправильно. 'C:\temp\new\x0cile.txt'
Обратите внимание на последний пример. В этом пути из-за того, что слеши не удвоены, возникло присутствие сразу трех специальных символов: \t , \n и \f (отображается как \x0c ). После преобразования этих специальных символов путь будет выглядеть следующим образом: . , . .
С:Табуляция>empПеревод строки>ewПеревод формата>ile.txt
Если такую строку передать в функцию open () , то это приведет к исключению OSError :
>>> open("C:\temp\new\file.txt") Traceback (most recent call last): File "", line 1, in open("C:\temp\new\file.txt") OSError: [Errno 22] Invalid argument: 'C:\temp\new\x0cile.txt'
если открываемый файл находится в текущем рабочем каталоге, то можно указать только название файла. Пример:
>>> import os.path # Подключаем модуль >>> # Файл в текущем рабочем каталоге (C:\Python34\) >>> os.path.abspath(r"file.txt") 'C:\\Python34\\file.txt'
>>> # Открываемый файл в C:\Python34\folder1\ >>> os.path.abspath (r"folder1/file.txt") 'C:\\Python34\\folder1\\file.txt' >>> # Открываемый файл в C:\Python34\folder1\folder2\ >>> os.path.abspath(r"folder1/folder2/file.txt") 'C:\\Python34\\folder1\\folder2\\file.txt'
>>> # Открываемый файл в С:\ >>> os.path.abspath (r"../file.txt") 'C:\\file.txt'
>>> # Открываемый файл в C:\book\folder1\ >>> os.path.abspath (r"/book/folder1/file.txt") 'C:\\book\\folder1\\file.txt' >>> # Открываемый файл в C:\book\folder1\folder2\ >>> os.path.abspath (r"/book/folder1/folder2/file.txt") 'C:\\book\\folder1\\folder2\\file.txt'
Как можно видеть, в абсолютном и относительном путях можно указать как прямые, так и обратные слеши. Все они будут автоматически преобразованы с учетом значения атрибута sep из модуля os.path . Значение этого атрибута зависит от используемой операционной системы. Выведем значение атрибута sep в операционной системе Windows :
>>> os.path.sep '\\' >>> os.path.abspath (r"С:/book/folder1/file.txt") 'С:\\book\\folder1\\file.txt'
При использовании относительного пути необходимо учитывать местоположение текущего рабочего каталога, т. к. рабочий каталог не всегда совпадает с каталогом, в котором находится исполняемый файл. Если файл запускается с помощью двойного щелчка на его значке, то каталоги будут совпадать. Если же файл запускается из командной строки, то текущим рабочим каталогом будет каталог, из которого запускается файл.
Рассмотрим все это на примере, для чего в каталоге C:\book создадим следующую структуру файлов:
С:\book\ test.py folder1\ __init__.py module1.py
Содержимое файла C:\book\test.py :
# -*- coding: utf-8 -*- import os, sys print("%-25s%s" % ("Файл:", os.path.abspath(__file__))) print("%-25s%s" % ("Текущий рабочий каталог:", os.getcwd())) print("%-25s%s" % ("Каталог для импорта:", sys.path[0])) print("%-25s%s" % ("Путь к файлу:", os.path.abspath("file.txt"))) print("-" * 40) import folder1.module1 as m m.get_cwd()
Файл C:\book\folder1\__init__.py создаем пустым. Как вы уже знаете, этот файл указывает интерпретатору Python , что данный каталог является пакетом с модулями.
Содержимое файла C:\book\folder1\module1.py :
# -*- coding: utf-8 -*- import os, sys def get_cwd(): print("%-25s%s" % ("Файл:", os.path.abspath(__file__))) print("%-25s%s" % ("Текущий рабочий каталог:", os.getcwd())) print("%-25s%s" % ("Каталог для импорта:", sys.path[0])) print("%-25s%s" % ("Путь к файлу:", os.path.abspath("file.txt")))
Архив со структурой каталогов и файлами можно взять здесь.
Запускаем командную строку, переходим в каталог C:\book и запускаем файл test.py :
Рис.1. Результат выполнения файла test.py
В этом примере текущий рабочий каталог совпадает с каталогом, в котором расположен файл test.py . Однако обратите внимание на текущий рабочий каталог внутри модуля module1.py . Если внутри этого модуля в функции open() указать название файла без пути, то поиск файла будет произведен в каталоге C:\book , а не C:\book\folder1 .
Теперь перейдем в корень диска С: и опять запустим файл test.py :
Рис.2. Результат выполнения файла test.py
В этом случае текущий рабочий каталог не совпадает с каталогом, в котором расположен файл test.py . Если внутри файлов test.py и module1.py в функции open() указать название файла без пути, то поиск файла будет производиться в корне диска С: , а не в каталогах с этими файлами.
Чтобы поиск файла всегда производился в каталоге с исполняемым файлом, необходимо этот каталог сделать текущим с помощью функции chdir() из модуля os . Для примера изменим содержимое файла test.py :
# -*- coding: utf-8 -*- import os, sys # Делаем каталог с исполняемым файлом текущим os.chdir (os.path.dirname(os.path.abspath(__file__))) print("%-25s%s" % ("Файл:", __file__)) print("%-25s%s" % ("Текущий рабочий каталог:", os.getcwd())) print("%-25s%s" % ("Каталог для импорта:", sys.path[0])) print("%-25s%s" % ("Путь к файлу:", os.path.abspath("file.txt")))
Архив с этим файлом можно взять здесь.
Обратите внимание на четвертую строку. С помощью атрибута __file__ мы получаем путь к исполняемому файлу вместе с названием файла. Атрибут __file__ не всегда содержит полный путь к файлу. Например, если запуск осуществляется следующим образом:
С:\book>C:\Python34\python test.py,
то атрибут будет содержать только название файла без пути. Чтобы всегда получать полный путь к файлу, следует передать значение атрибута в функцию abspath() из модуля os.path . Далее мы извлекаем путь (без названия файла) с помощью функции dirname() и передаем его функции chdir() . Теперь, если в функции open() указать название файла без пути, то поиск будет производиться в каталоге с этим файлом. Запустим файл test.py с помощью командной строки:
Рис.3. Результат выполнения файла test.py
Функции, предназначенные для работы с каталогами, мы еще рассмотрим подробно в следующих шагах. Сейчас же важно запомнить, что текущим рабочим каталогом будет каталог, из которого запускается файл, а не каталог, в котором расположен исполняемый файл. Кроме того, пути поиска файлов не имеют никакого отношения к путям поиска модулей.
На следующем шаге мы закончим рассмотрение функции open() .