Модуль 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 в комментарий заключайте его в теги
Самая лучшая практика: работа с path в Python
В последней статье мы использовали рекурсивную функцию размером менее 10 строк для решения проблемы сканирования папок и ранжирования файлов по дате изменения и размеру.
Теперь я подниму планку и покажу, как можно было сделать лучше.
Объединяем пути с помощью Pathlib
Старые идеи в новом обличье?
Предыдущее решение с соединением путей выглядело следующим образом:
path_file = os.sep.join([path_dir, filename])
Преимущество такого подхода заключается в том, что решение не зависит от операционной системы, и вам не нужно складывать строки с помощью оператора «+» или форматирования.
Тем не менее, здесь можно допустить ошибку, например, непреднамеренно или ошибочно определить путь к каталогу с помощью закрывающего разделителя.
path_dir: str = r"C:/Users/sselt/Documents/blog_demo/" # abschließender Trenner filename: str = "some_file" path_file = os.sep.join([path_dir, filename]) # C:/Users/sselt/Documents/blog_demo/\some_file
Несмотря на то, что в этом примере показан рабочий код, неправильный разделитель приведет к ошибке при вызове этого пути. И такие ошибки могут возникать всякий раз, когда далекие от кода пользователи оперируют путями в конфигурационных файлах, не обращая внимания на соглашения.
В Python 3.4 появилось лучшее решение — модуль pathlib . Он обрабатывает функции файлов и папок модуля os с помощью объектно-ориентированного подхода.
Напомню, старый вариант выглядел вот так:
import os path = "C:/Users/sselt/Documents/blog_demo/" os.path.isdir(path) os.path.isfile(path) os.path.getsize(path)
А вот альтернативный:
from pathlib import Path path: Path = Path("C:/Users/sselt/Documents/blog_demo/") path.is_dir() path.is_file() path.stat().st_size
Оба варианта дают один и тот же результат. Так чем же второй вариант лучше?
Объектно-ориентированный и более устойчивый к ошибкам
Вызовы в основном являются объектно-ориентированными, нравится вам это или нет, но лично мне такой подход по душе. Здесь у нас есть такой объект, как определение path , у которого есть атрибуты и методы.
Однако пример с операторами перегрузки в данном случае более интересен:
filename: Path = Path("some_file.txt") path: Path = Path("C:/Users/sselt/Documents/blog_demo") print( path / filename ) # C:\Users\sselt\Documents\blog_demo\some_file.txt
Сначала разделение на два пути кажется недопустимым. Однако объект path был перегружен так, чтобы работать как объединенный путь.
В дополнение к этому синтаксическому сахару объекты path будут перехватывать другие типичные ошибки:
filename: Path = Path("some_file.txt") # hier path mit überflüssigem Trenner am Schluss path: Path = Path("C:/Users/sselt/Documents/blog_demo/") # hier path mit doppeltem Trenner path: Path = Path("C:/Users/sselt/Documents/blog_demo//") # hier path völlig durcheinander path: Path = Path("C:\\Users/sselt\\Documents/blog_demo") # hier ein wilder Mix # alle Varianten führen zum selben Ergebnis print(path/filename) # C:\Users\sselt\Documents\blog_demo\some_file.txt
Такой вариант не только приятнее, но и устойчивее к неправильным входным данным. В дополнение к другим преимуществам код также не привязан к определенной операционной системе. Он определяет только generic объект path , который объявляется в системе Windows как WindowsPath , а в Linux как PosixPath .
Большинство функций, которые ожидают строку в качестве пути, могу работать непосредственно с путем. В редких случаях вам может понадобиться изменить объект просто с помощью str(Path) .
Обработка пути с помощью os.walk
В своей последней статье я использовал os.listdir , os.path.isdir и рекурсивную функцию для итерации по дереву путей и разграничения файлов и папок.
Но os.walk предлагает решение получше. Этот метод создает не список, а итератор, который можно вызывать построчно. В результате мы получим соответствующий путь к папке и список всех файлов по этому пути. Весь процесс происходит рекурсивно, поэтому вы получите все файлы одним вызовом.
Лучшее решение с os.walk и Pathlib
Если вы объедините два вышеупомянутых метода, то получите решение, которое будет более простым, полностью независимым от операционной системы, устойчивым к неправильным форматам путей и без явных рекурсий:
filesurvey = [] for row in os.walk(path): # row beinhaltet jeweils einen Ordnerinhalt for filename in row[2]: # row[2] ist ein tupel aus Dateinamen full_path: Path = Path(row[0]) / Path(filename) # row[0] ist der Ordnerpfad filesurvey.append([path, filename, full_path.stat().st_mtime, full_path.stat().st_size])
Если вам удастся улучшить этот вариант, не постесняйтесь рассказать мне об этом. Я был бы рад вашим отзывам!
Первую часть статьи можно найти здесь.
Перевод статьи подготовлен в преддверии старта курса «Python Developer. Basic».
Также приглашаем всех желающих принять участие в бесплатном демо-уроке курса на тему «Три кита: map(), filter() и zip()».
Можно ли писать код, требующий циклов, но без циклов? Может ли он быть быстрее, чем, если бы мы использовали циклы в Python? Для реализации задуманного понадобится знание слов "callback", "iterator" и "lambda". Если интересно — присоединяйтесь!
- Блог компании OTUS
- Python
- Программирование
. что такое переменная среды PATH?
Когда операционная система запускает какую-нибудь программу, она стартует новый процесс и каким-то образом передаёт ему информацию о настройках среды, или окружения (в английском языке используется термин environment). Эта информация состоит из набора переменных, содержащих некоторые значения. Процесс может получить эти значения, обратившись к нужной переменной по имени. Например, чтобы узнать, где находится директория, которую операционная система рекомендует использовать для хранения временных файлов, необходимо получить значение переменной среды TEMP .
Как посмотреть значения переменных среды?
В консоли Windows можно посмотреть значение этой переменной, выполнив команду echo %TEMP% , в консоли PowerShell необходимо для этого выполнить команду echo $Env:TEMP , а в консоли Linux или MacOS – команду echo $TEMP .
Если вы пишете программу на языке программирования Python, значение этой переменной можно получить так:
import os temp = os.environ["TEMP"]
В языке Java это можно сделать следующим образом:
String temp = System.getenv().get("TEMP");
В языке C# аналогичное действие выглядит следующим образом:
string temp = System.Environment.GetEnvironmentVariable("TEMP");
На что влияет переменная среды PATH ?
При помощи переменных среды можно передавать информацию не только запускаемым процессам, но и самой операционной системе. Она тоже читает и использует значения переменных среды, поэтому можно управлять некоторыми аспектами поведения операционной системы, изменяя эти переменные.
Переменная PATH содержит список директорий, в которых операционная система пытается искать исполняемые файлы, если пользователь при запуске не указал явно путь к нужному исполняемому файлу.
Давайте представим себе, что на компьютере с операционной системой Windows установлено две разных версии интерпретатора языка программирования Python. Это можно сделать, если установить их в разные директории, например, C:\Python27 и C:\Python34 . Исполняемый файл для обоих версий называется python.exe .
Для того, чтобы запустить исполняемый файл нужной версии, можно указать полный путь к нему, например, C:\Python34\python.exe :
Но каждый раз указывать полный путь лень, да ещё и помнить его надо.
Альтернатива – добавить в переменную среды PATH путь к директории, где находится этот исполняемый файл, и тогда его можно будет запускать, указывая только имя. А чтобы узнать, где он (по мнению операционной системы) находится, можно использовать команду where в операционной системе Windows либо команду which в операционной системе Linux или MacOS.
Переменная PATH содержит список директорий, в которых операционная система должна искать исполняемые файлы. В качестве разделителя используется точка с запятой (;) в операционной системе Windows и двоеточие (:) в операционных системах Linux и MacOS.
Обратите внимание, что в переменную PATH нужно добавлять не пути к исполняемым файлам, а пути к директориям, где они находятся!
Переменная PATH и программы-утилиты
Не обязательно добавлять в переменную PATH пути ко всем директориям, в которых находятся исполняемые файлы на вашем компьютере. Скорее всего большинство программ вы запускаете “через меню старт”. На этот способ запуска переменная PATH никакого влияния не оказывает. Её важно настроить так, чтобы можно было быстро и удобно запускать программы из консоли.
Например, в эту переменную обычно включается путь к “стандартным” местам, где расположены различные программы-утилиты. В операционной системе Windows это директория C:\Windows\system32 , в операционных системах Linux и MacOS директория /usr/bin .
Именно благодаря этому мы можем, например, в консоли Windows использовать утилиту find для поиска файлов или утилиту telnet для установления удалённого соединения по одноимённому протоколу, просто указывая их имя, а не полный путь c:\Windows\system32\telnet.exe .
Когда у вас появляется новая программа-утилита, возникает вопрос – куда её поместить? С одной стороны, её можно положить в C:\Windows\system32 или /usr/bin . Но если вы не любите “засорять” стандартные директории, тогда сделайте какую-нибудь специальную директорию, складывайте все такие программы в неё, и добавьте путь к этой директории в переменную среды PATH .
Как изменять значения переменных среды?
Пользователям других операционных систем предлагаю погуглить 🙂
Переменную поменял, но эффекта нет. Почему?
Когда вы меняете значение некоторой переменной среды, об этом узнаёт только операционная система. При запуске новых программ она сообщит им новые значения переменных. Но ранее запущенные программы будут продолжать использовать те значения переменных среды, которые были актуальны на момент запуска программы.
Поэтому после изменения переменных среды придётся перезапустить те программы, которым необходимо сообщить новые значения переменных.
August 23
2016
Автор: Алексей Баранцев
Если вам понравилась эта статья, вы можете поделиться ею в социальных сетях (кнопочки ниже), а потом вернуться на главную страницу блога и почитать другие мои статьи.
Ну а если вы не согласны с чем-то или хотите что-нибудь дополнить – оставьте комментарий ниже, может быть это послужит поводом для написания новой интересной статьи.
Краткий обзор раздела: Модуль os.path в Python, операции с путями ОС
Модуль os.path реализует некоторые полезные функции для манипулирования путями файловой системы. Параметры пути могут быть переданы в виде строк или байтов. Приложениям рекомендуется представлять имена файлов в виде (Unicode) символьных строк.
Функция abspath() модуля os.path в Python.
Функция `abspath()` модуля `os.path` вернет нормализованную абсолютную версию пути. На большинстве платформ это эквивалентно вызову функции `os.path.normpath()` следующим образом: `os.path.normpath(join(os.getcwd(),path))`.
Функция basename() модуля os.path в Python.
Функция `basename()` модуля `os.path` возвращает базовое имя пути. Это второй элемент пары, возвращаемый путем передачи пути к функции `os.path.split()`.
Функция commonpath() модуля os.path в Python.
Функция `commonpath()` модуля `os.path` возвращает самый длинный общий подпуть каждого пути в последовательности `paths`.
Функция commonprefix() модуля os.path в Python.
Функция `commonprefix()` модуля `os.path` возвращает самый длинный префикс пути, расчитанный посимвольно, который является префиксом всех путей в списке `list`. Если список пуст, то вернет пустую строку `''`.
Функция dirname() модуля os.path в Python.
Функция `dirname()` модуля `os.path` возвращает имя каталога в пути `path`. Это первый элемент пары, возвращаемый путем передачи пути к функции `os.path.split()`.
Функция exists() и lexists() модуля os.path в Python.
Функция exists() модуля os.path возвращает True, если путь ссылается на существующий путь в файловой системе или дескриптор открытого файла.
Функция expanduser() модуля os.path в Python.
Функция `expanduser()` модуля `os.path` возвращает аргумент с начальным компонентом пути `'~'` или `'~user'`, замененным домашним каталогом этого пользователя.
Функция expandvars() модуля os.path в Python.
Функция `expandvars()` модуля `os.path` возвращает аргумент с расширенными переменными среды окружения. Подстроки в виде $name или $
Функция getatime() модуля os.path в Python.
Функция `getatime()` модуля `os.path` возвращает время последнего доступа к файлу или каталогу, указанному в `path`.
Функция getmtime() модуля os.path в Python.
Функция `getmtime()` модуля `os.path` возвращает время последней модификации файла или каталога, указанному в `path`.
Функция getctime() модуля os.path в Python.
Функция `getctime()` модуля `os.path` возвращает системное время `ctime`, которое в некоторых системах, например Unix, является временем последнего изменения метаданных, а в Windows - временем создания файла или каталога, указанномого в `path`.
Функция getsize() модуля os.path в Python.
Функция `getsize()` модуля `os.path` возвращает размер файла в байтах, указанного в `path`.
Функция isabs() модуля os.path в Python.
Функция `isabs()` модуля `os.path` возвращает `True` если путь является абсолютным, `False` в противном случае.
Функция isfile() модуля os.path в Python.
Функция `isfile()` модуля `os.path` возвращает `True` если путь `path` существует и является обычным файлом, `False` в противном случае.
Функция isdir() модуля os.path в Python.
Функция `isdir()` модуля `os.path` возвращает `True` если путь `path` существует и является каталогом, `False` в противном случае.
Функция islink() модуля os.path в Python.
Функция `islink()` модуля `os.path` возвращает `True` если путь `path` относится к существующей записи каталога, который является символической ссылкой.
Функция ismount() модуля os.path в Python.
Функция `ismount()` модуля `os.path` возвращает `True` если путь `path` существует и является точкой монтирования, `False` в противном случае.
Функция join() модуля os.path в Python.
Функция `join()` модуля `os.path` правильно соединяет переданный путь `path` к одному или более компонентов пути `*paths`.
Функция normcase() модуля os.path в Python.
Функция `normcase()` модуля `os.path` нормализует регистр имени в пути `path`.
Функция normpath() модуля os.path в Python.
Функция `normpath()` модуля `os.path` нормализует имя пути, свернув избыточные разделители и ссылки верхнего уровня, чтобы `A//B`, `A/B/`, `A/./B` и `A/foo/../B` все стали `A/B`.
Функция realpath() модуля os.path в Python.
Функция realpath() модуля os.path возвращает канонический путь указанного имени файла path, исключая любые символические ссылки, встречающиеся в пути если они поддерживаются операционной системой.
Функция relpath() модуля os.path в Python.
Функция `relpath()` модуля `os.path` возвращает относительный путь к файлу `path` либо из текущего каталога, либо из необязательного начального каталога `start`.
Функция samefile() модуля os.path в Python.
Функция `samefile()` модуля `os.path` возвращает `True`, если оба аргумента пути `path1` и `path2` ссылаются на один и тот же файл или каталог.
Функция sameopenfile() модуля os.path в Python.
Функция `sameopenfile()` модуля `os.path` возвращает `True`, если файловые дескрипторы `fp1` и `fp2` ссылаются на один и тот же файл, `False` в противном случае.
Функция samestat() модуля os.path в Python.
Функция `samestat()` модуля `os.path` возвращает `True`, если кортежи `stat1` и `stat2` ссылаются на один и тот же файл.
Функция split() модуля os.path в Python.
Функция `split()` модуля `os.path` делит путь `path` на двойной кортеж `(head, tail)`, где `tail` - это последний компонент имени пути, а `head` - это все остальное.
Функция splitdrive() модуля os.path в Python.
Функция `splitdrive()` модуля `os.path` делит путь `path` на двойной кортеж `(drive, tail)`, где `drive` является либо точкой монтирования, либо пустой строкой.
Функция splitext() модуля os.path в Python.
Функция `splitext()` модуля `os.path` делит путь `path` на двойной кортеж `(root, ext)`, так что `root + ext == path`.
Свойство supports_unicode_filenames модуля os.path в Python.
Свойство supports_unicode_filenames() модуля os.path возвращает True, если в качестве имен файлов могут использоваться произвольные строки Unicode в пределах ограничений, налагаемых файловой системой.
Функция isjunction() модуля os.path в Python.
Новое в Python 3.12. Функция os.path.isjunction() модуля os.path возвращает значение True, если путь path относится к существующей записи каталога, которая является соединением.
Функция isdevdrive() модуля os.path в Python.
Новое в Python 3.12. Функция isdevdrive() модуля os.path возвращает значение True, если путь path находится на диске разработчика Windows Dev Drive. А Dev Drive оптимизирован для сценариев разработки и обеспечивает более высокую производительность при чтении и записи файлов.
Функция splitroot() модуля os.path в Python.
Новое в Python 3.12. Функция splitroo() модуля os.path разделяет имя пути path на кортеж из трех элементов (drive, root, tail).