os.path

Содержание
Введение
abspath
basename
Все методы path
dirname
exists
isdir
isfile
join
realpath
split
splitext
os.pardir: Путь до родителя
Похожие статьи

Введение

os.path.abspath()

Абсолютный путь до файла можно получить с помощью abspath()

import os print(os.path.abspath(__file__))

C:\Users\Andrei\openapi\yaml_to_json.py

os.path.basename()

Получить из пути до файла только имя файла можно с помощью basename()

import os print(os.path.basename("C:\\Users\\Andrei\\openapi.yaml"))

openapi.yaml

Все доступные методы

Список всех атрибутов и методов os.path можно получить с помощью функции dir()

print(dir(os.path))

['__all__', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_get_sep', '_joinrealpath', '_path_normpath', '_varprog', '_varprogb', 'abspath', 'altsep', 'basename', 'commonpath', 'commonprefix', 'curdir', 'defpath', 'devnull', 'dirname', 'exists', 'expanduser', 'expandvars', 'extsep', 'genericpath', 'getatime', 'getctime', 'getmtime', 'getsize', 'isabs', 'isdir', 'isfile', 'islink', 'ismount', 'join', 'lexists', 'normcase', 'normpath', 'os', 'pardir', 'pathsep', 'realpath', 'relpath', 'samefile', 'sameopenfile', 'samestat', 'sep', 'split', 'splitdrive', 'splitext', 'stat', 'supports_unicode_filenames', 'sys']

os.path.dirname()

Имя директории, в которой находится файл можно получить с помощью dirname

Например, если нужно получить директорию, в которой находится используемый Python можно выполнить

import os import sys print(os.path.dirname(sys.executable)

'C:\\Users\\ao\\AppData\\Local\\Programs\\Python\\Python312\\python.exe'

Рассмотрим примеры, когда нужно получить путь до директории с файлом из проекта, например с настройками проекта config.toml

|-- config.toml `-- dirname_ex.py

import os print(os.path.dirname("./config.toml"))

python dirname_ex.py

.

Обсудим разницу между dirname() и os.getcwd()

os `-- dirname_demo |-- lib | |-- config.toml | `-- utils.py `-- test `-- test.py

Директорию os добавим в PYTHONPATH чтобы сделать подобие пакета

cd /c/Users/ao/os
export PYTHONPATH=$(pwd)
echo $PYTHONPATH

/c/Users/ao/os

Функция demo() из файла utils.py будет выводить os.path.dirname() и os.getcwd()

Аргументом os.path.dirname() будет атрибут __file__ про который можно прочитать здесь .

Обратите внимание на то, что utils.py и config.toml находятся в одной директории, а test.py расположен в соседней.

import os def demo(): for path in ["config.toml", __file__]: print(f"os.path.dirname('{path}'):") print(f"PATH: {os.path.dirname(path)}") print(f"CWD : {os.getcwd()}") if __name__ == "__main__": print("utils.py direct call") else: print("utils.py called from other module") demo()

Всё, что делает test.py это импорт utils.py

import dirname.lib.utils

Если вызвать utils.py напрямую из dirname_demo то:

Путь до файла config.toml не будет найден,

os.path.dirname(__file__) укажет на директорию lib

getcwd() на директорию dirname_demo из которой был вызван скрипт.

python lib/utils.py

utils.py direct call os.path.dirname('config.toml'): PATH: os.path.dirname('C:\Users\ao\os\dirname_demo\lib\utils.py'): PATH: C:\Users\ao\os\dirname_demo\lib CWD : C:\Users\ao\os\dirname_demo

В случае если utils.py вызван напрямую из lib то:

Путь до файла config.toml всё равно не будет найден,

os.path.dirname(__file__) укажет на директорию lib

getcwd() тоже на директорию lib так как скрипт теперь вызван оттуда. Важно понимать, что это совпадение носит частный характер.

python utils.py

utils.py direct call os.path.dirname('config.toml'): PATH: os.path.dirname('C:\Users\ao\os\dirname_demo\lib\utils.py'): PATH: C:\Users\ao\os\dirname_demo\lib CWD : C:\Users\ao\os\dirname_demo\lib

Если запустить test.py то os.path.dirname(__file__) укажет на директорию lib

getcwd() на директорию test так как скрипт теперь вызван оттуда.

python test.py

utils.py called from other module os.path.dirname('config.toml'): PATH: os.path.dirname('C:\Users\ao\os\dirname_demo\lib\utils.py'): PATH: C:\Users\ao\os\dirname_demo\lib CWD : C:\Users\ao\os\dirname_demo\test

Теперь предположим, что utils.py работает с config.py А вызвается utils.py из test.py

Чтобы стабильно получать путь до config.toml нужно воспользоваться os.path.dirname(__file__) и os.path.join()

# utils.py import os def demo(): filename = "config.toml" file_path = os.path.join(os.path.dirname(__file__), filename) print(file_path) if __name__ == "__main__": print("utils.py direct call") else: print("utils.py called from other module") demo()

Теперь независимо от того откуда вызвается demo() путь до файла с конфигом находится одинакого.

python utils.py

utils.py direct call C:\Users\ao\os\dirname_demo\lib\config.toml

python test.py

utils.py called from other module C:\Users\ao\os\dirname_demo\lib\config.toml

Изучить применение os.path.dirname() для чтения конфигурационных файлов можно в статье «Python configparser»

os.path.exists()

Проверить существует ли путь поможет exists().

Альтернативный способ этой проверки - использовать Path.exists() из библиотеки pathlib

sandbox |-- exists_demo.py `-- real.txt

import os print(os.path.exists("real.txt")) print(os.path.exists("missing.txt"))

python exists_demo.py

True False

os.path.isdir()

isdir() помогает определить является ли файл директорией

Если вы работаете c файлами в Linux рекомендую прочитать эту статью

sandbox |-- directory | `-- nested.txt |-- is_dir_demo.py `-- real.txt

import os print(os.path.isdir("real.txt")) print(os.path.isdir("directory"))

python is_dir_demo.py

False True

os.path.isfile()

isfile() помогает определить является файл обычным файлом смогут

Если вы работаете c файлами в Linux рекомендую прочитать эту статью

sandbox |-- directory | `-- nested.txt |-- is_file_demo.py `-- real.txt

import os print(os.path.isfile("real.txt")) print(os.path.isfile("directory"))

python is_file_demo.py

True False

Практический пример применения isfile вы можете изучить в статье shutil

os.path.join()

os.path.join() избавляет от необходимости думать о том нужно ли ставить слеш в путь или нет, а также какой именно слеш ставить в зависимости от ОС.

Как можно убедиться из кода (Python 3.10) возвращает LiteralString, обычный str или bytes.

@overload def join(__a: LiteralString, *paths: LiteralString) -> LiteralString: ... @overload def join(__a: StrPath, *paths: StrPath) -> str: ... @overload def join(__a: BytesPath, *paths: BytesPath) -> bytes: ...

Если в Windows нужно объединить путь с именем диска, то слеши проставить придётся:

Пример применения os.path.join() в Windows

import os pf = os.path.join("C:\\", "Program Files") os.chdir(pf) print(os.listdir())

['7-Zip', 'Adobe', 'Android', 'Common Files', 'DB Browser for SQLite', 'Docker', 'dotnet', 'Git', 'Google', 'Hyper-V', 'Internet Explorer', 'Microsoft', 'Microsoft Office 15', 'Microsoft SQL Server', 'Microsoft Visual Studio', 'Mozilla Firefox', 'Notepad++', 'Npcap', 'OpenVPN Connect', 'PowerShell', 'Windows Defender', 'WindowsPowerShell', 'WinMerge', 'Wireshark', 'WSL']

А вот дальше уже можно расслабиться

import os pf = os.path.join("C:\", "Program Files") p7 = os.path.join(pf, "PowerShell", "7") os.chdir(p7) print(os.listdir())

['Accessibility.dll', 'assets', 'clretwrc.dll' … 'wpfgfx_cor3.dll', 'zh-Hans', 'zh-Hant']

Пример создания пути до файла во вложенной директории

├───config.py └───etc └───token.json

# config.py token_path = os.path.join(os.path.dirname(__file__), "etc", "token.json")

Пример применения os.path.join() вы можете изучить в статье shutil

Ещё один пример применения os.path() вы можете изучить также в статье «Пакеты в Python»

import os file_path = os.path.join(os.environ.get("HOME"), "test.txt") print(file_path) with open(file_path, "w") as f: f.write("")

python os_path_ex.py

/home/andrei/test.txt

Проверим, что файл создан в домашней директории.

ls ~

test.txt

У path довольно обширный функционал.

import os file_path = os.path.join(os.environ.get("HOME"), "test.txt") print(os.path.basename(file_path))

test.txt

os.path.realpath()

Полный путь до файла можно получить с помощью realpath

demo/ |-- config.toml `-- realpath_ex.py

import os print(os.path.realpath("./config.toml"))

python realpath_ex.py

C:\Users\AO\demo\config.toml

os.path.split()

Отделить имя файла от полного пути поможет split, а splitext отделит расширение файла от всего остального.

import os print(os.path.split(file_path)) print(os.path.splitext(file_path))

('/home/andrei', 'test.txt') ('/home/andrei/test', '.txt')

os.pardir

Применение os.path совместно с os.pardir для получения путей до родительских директорий.

Рассмотрим как из скрипта os_pardir.py, который находится в директории os получить путь до файла requirements.txt, который находится в соседней директории fastapi

python/ |-- fastapi | `-- requirements.txt `-- os `-- os_pardir.py

# os_pardir.py import os p = os.path.join(os.path.dirname(__file__), os.path.pardir) print(p) p = os.path.join(os.path.pardir, "fastapi", "requirements.txt") print(p) with open(p, "r") as f: print(f.read())

C:\Users\Andrei\python\.. ..\fastapi\requirements.txt fastapi uvicorn[standard]

Пути до поддиректорий

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

Из файла demo.py нужно получить пути до всех директорий, вложенных в log, исключив обычные файлы.

list_dir/ |-- log | |-- dir_a | | `-- file_a | |-- dir_b | | |-- file_b | | `-- file_c | |-- file_x | `-- file_y `-- src `-- demo.py

Следующий скрипт должен вернуть пути до dir_a и dir_b но не до file_x и file_y.

Убедитесь, что вы с знакомы с тем, что такое генератор списков

В качестве проверки выведем на экран содержимое полученных путей с помощью os.listdir()

import os def get_paths(path): return [os.path.join(path, x) for x in os.listdir(path)] # Получаем путь до директории list_dir root = os.path.join(os.path.dirname(__file__), os.path.pardir) # Получаем путь до директории list_dir/log log_dir = os.path.join(root, "log") # Получаем пути до всех файлов в list_dir/log paths = get_paths(log_dir) # Оставляем только пути до директорий log_dirs = list(filter(os.path.isdir, paths)) # Выводим на экран содержимое директорий for d in log_dirs: print(d) print(os.listdir(d))

Можно не создавать отдельную функцию

import os # Получаем путь до директории list_dir root = os.path.join(os.path.dirname(__file__), os.path.pardir)paths = [os.path.join(log_dir, x) for x in os.listdir(log_dir)]

python demo.py

C:\Users\A\list_dir\src\..\log\dir_a ['file_a'] C:\Users\A\list_dir\src\..\log\dir_b ['file_b', 'file_c']

Похожие статьи
Основы Python
Python
Установка Python
ООП в Python
Функции
docstring
#!: Shebang
Объекты
os
pathlib
Сложности при работе с Python

РЕКЛАМА от Яндекса. Может быть недоступна в вашем регионе

Конец рекламы. Если там пусто считайте это рекламой моей телеги

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: