os.path

Введение

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() избавляет от необходимости думать о том нужно ли ставить слеш в путь или нет, а также какой именно слеш ставить в зависимости от ОС.

Пример применения 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')

Автор статьи: Андрей Олегович

Изображение баннера