Модуль 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 в комментарий заключайте его в теги
Различия в оставления пути к файлу в Unix и Windows
При доступе к файлу в операционной системе требуется правильно указать путь к файлу. Путь к файлу - это строка, которая представляет местоположение файла.
Предупреждение. Сразу оговоримся, чтобы не получить геморрой при составлении путей к файлам с системе Windows используйте встроенный модуль pathlib .
# Unix /path/to/file/text.txt # Windows c:\path\to\file\text.txt
Он разбит на три основные части:
- Путь к файлу /path/to/file/ : расположение директории в файловой системе, где папки разделены прямой косой чертой '/' в Unix подобных системах или обратной косой чертой '\' в Windows.
- Имя файла text : фактическое имя файла.
- Расширение .txt : используется для указания типа файла.
Для чтения или записи в файл нам необходимо его открыть, а для этого нужно передать путь к нужному файлу в качестве строки функции open() . Для Unix подобных систем это делается просто:
>>> full_path = '/path/to/file/text.txt' >>> print(full_path) # /path/to/file/text.txt
В системе Windows путь включает в себя обратную косую черту '\' . Этот символ в строках на Python используется для экранирования [escape-последовательностей][escape-sequence], таких как новая строка '\n' .
>>> full_path = 'c:\path\to\file\text.txt' >>> print(full_path) # c:\path o # ile ext.txt
Что бы избежать Windows системах такого безобразия, нам нужно вручную экранировать обратную косую черту '\\' или передавать в функции open() сырую (необработанную) строку, указав перед первой кавычкой строковой литерал 'r' :
# экранируем обратную косую черту >>> full_path = 'c:\\path\\to\\file\\text.txt' >>> print(full_path) # c:\path\to\file\text.txt # строковой литерал raw строки >>> full_path = r'c:\path\to\file\text.txt' >>> print(full_path) # c:\path\to\file\text.txt
А вот как просто создавать и использовать пути при помощи встроенного модуля pathlib . Так как модуль встроенный, то устанавливать ничего не надо.
Строковое представление пути можно посмотреть функцией str() - это сам необработанный путь к файловой системе в собственном виде, например с обратным слешем в Windows, который можно передать любой функции, принимающей путь к файлу в виде строки:
>>> import pathlib # Код запущен на Unix системах >>> path = pathlib.Path('/foo', 'bar', 'baz') >>> path # PosixPath('/foo/bar/baz') >>> str(path) # '/foo/bar/baz' # Код запущен на Windows системе >>> path = pathlib.Path('c:/', 'foo', 'bar') >>> path # WindowsPath('c:/foo/bar') # Строковое представление пути # экранирование происходит автоматически >>> str(path) # 'c:\\foo\\bar'
Переводить путь в текстовое представление не обязательно, т.к. объект пути модуля pathlib принимают все функции.
Оператор косой черты помогает создавать дочерние пути, аналогично os.path.join():
>>> import pathlib # Сложение путей файловой системы >>> p = pathlib.Path('/etc') >>> p # PosixPath('/etc') >>> p1 = p / 'init.d' / 'apache2' >>> p1 # PosixPath('/etc/init.d/apache2') >>> q = pathlib.Path('bin') >>> q1 = '/usr' / q >>> q1 # PosixPath('/usr/bin')
# разложение пути >>> p = pathlib.Path('c:/Program Files/PSF') >>> p.parts # ('c:\\', 'Program Files', 'PSF') >>> p.is_dir() # True # определение диска >>> pathlib.Path('c:/Program Files/').drive # 'c:' >>> pathlib.Path('/Program Files/').drive # '' # определение родительской директории >>> p = pathlib.Path('c:/foo/bar/setup.py') >>> p.is_file() # True >>> p.parents[0] # WindowsPath('c:/foo/bar') >>> p.parents[1] # WindowsPath('c:/foo') >>> p.parents[2] # WindowsPath('c:/') # Двигаемся вверх по директории >>> for up in p.parents: . print(up) . # c:\foo\bar # c:\foo # c:\
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Составление пути к файлу в Unix и Windows
- Открытие/закрытие файла для чтения/записи
- Типы обрабатываемых данных и файлов
- Способы чтения открытого файла
- Способы записи в открытый файл
- Одновременное чтение из одного и запись в другой файл
- Добавление данных в открытый файл
- Управление указателем чтения/записи в файле
- Создание менеджера для обработки файла
- Сохранение словарей в формат JSON
- Встроенные модули для работы с разными форматами
Путь, имя и расширение файла
Достаточно часто возникают ситуации, когда у нас есть полное имя файла, а требуется узнать его расширение. Или добавить нужное расширение, когда не известно, ввел его пользователь или нет. Иногда у нас есть относительный путь до файла, а требуется узнать абсолютный. Про основные методы работы с именем файла и будет эта статья.
Абсолютный путь к файлу
Для того чтобы узнать в 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. Лучше воспользоваться готовым решением из стандартой библиотеками, чем писать свое решение.
Как получить полный путь к файлу в диалоге выбора файла?

А где диалог-то? Покажите код (не забудьте тегами обрамить код).

QWERTYUIOPas @QWERTYUIOPas Автор вопроса
from tkinter import filedialog as fd fd.askopenfile()
Решения вопроса 1

Алан Гибизов @phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Я бы делал, наверно, как-то так:
from tkinter import filedialog as fd from pathlib import Path selected_file = Path(fd.askopenfile().name) print(type(selected_file), selected_file)
Ответ написан более двух лет назад

Алан Гибизов @phaggi Куратор тега Python
Иногда для красоты можно спрятать окошко, и получится такой код:
from tkinter import filedialog as fd from tkinter import Tk from pathlib import Path root = Tk() root.withdraw() selected_file = Path(fd.askopenfile().name) print(type(selected_file), selected_file)
Ответы на вопрос 0
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Python
- +1 ещё
Как сделать форму с добавлением нескольких элементов на django?
- 1 подписчик
- 2 часа назад
- 19 просмотров