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 |
РЕКЛАМА от Яндекса. Может быть недоступна в вашем регионе
Конец рекламы. Если там пусто считайте это рекламой моей телеги