Python модуль os: обзор основных функций
Python модуль os дает программе доступ к возможностям операционной системы: файлам и папкам, путям, переменным окружения, сведениям о процессе и системе. Ниже функции модуля разобраны по группам с примерами, показано, чем отличаются платформы, и объяснено, когда вместо os лучше взять pathlib, shutil или subprocess.

Содержание статьи
Что входит в модуль os
Модуль встроен в стандартную библиотеку и подключается строкой import os. Он скрывает различия между Windows, Linux и macOS: один и тот же вызов работает везде, а функции, которые есть только на одной платформе, помечены в документации как Unix или Windows.
Импортировать модуль лучше целиком, а не через from os import *. Иначе функция os.open() заменит встроенную open(), а работают они по-разному: первая возвращает числовой дескриптор, вторая файловый объект.
| Группа | Основные функции |
|---|---|
| Каталоги | getcwd(), chdir(), listdir(), scandir(), mkdir(), makedirs(), rmdir(), walk() |
| Файлы | remove(), rename(), replace(), stat(), chmod() |
| Пути | подмодуль os.path: join(), exists(), splitext() и другие |
| Окружение | environ, getenv(), putenv() |
| Система и процесс | name, sep, cpu_count(), getpid(), getlogin(), urandom() |
| Запуск команд | system(), startfile() (Windows) |
Файлы и папки
Базовые операции с папками и файлами выполняются короткими вызовами. Пути в Windows удобно писать через прямой слеш или в сырой строке, чтобы обратный слеш не превратился в управляющий символ.
import os
os.mkdir("test") # одна папка
os.makedirs("c:/catalog/test", exist_ok=True) # цепочка папок
os.rename("c:/catalog/a.txt", "c:/catalog/b.txt")
os.remove("c:/catalog/b.txt") # удалить файл
os.rmdir("test") # удалить пустую папкуos.rmdir() удаляет только пустую папку, для папки с содержимым есть shutil.rmtree(). Пошаговые сценарии со списком файлов, обходом дерева и копированием собраны в статье про управление каталогами и файлами.
Сведения о файле через os.stat
os.stat() возвращает объект с размером, временем изменения, правами и другими атрибутами файла. Время приходит в секундах от начала эпохи, его переводят в дату модулем datetime.
import os
from datetime import datetime
info = os.stat("main.py")
print(info.st_size) # размер в байтах
print(datetime.fromtimestamp(info.st_mtime)) # дата измененияПодмодуль os.path
os.path работает с путями как со строками: склеивает, разбирает на части, проверяет существование. Он учитывает разделитель текущей системы, поэтому код с os.path.join() одинаково работает в Windows и Linux.
import os.path as p
path = p.join("data", "2024", "report.csv")
print(path) # data/2024/report.csv (в Windows data\2024\report.csv)
print(p.basename(path)) # report.csv
print(p.dirname(path)) # data/2024
print(p.splitext(path)) # ('data/2024/report', '.csv')
print(p.abspath(".")) # полный путь к текущей папке
print(p.expanduser("~")) # домашняя папка пользователяДля проверок есть exists(), isfile(), isdir() и getsize(). Классический пример: перед открытием файла проверить, что он существует.
import os
filename = input("Введите путь к файлу: ")
if os.path.isfile(filename):
print("Файл найден, размер", os.path.getsize(filename), "байт")
else:
print("Файл не существует")В новом коде те же задачи короче решаются объектами Path: Path("data") / "report.csv". Сравнение двух подходов приведено в статье о pathlib.
Переменные окружения
os.environ ведет себя как словарь с переменными окружения процесса. В них обычно хранят настройки, которые не должны попадать в код: адреса баз данных, токены, режим отладки.
import os
print(os.environ.get("HOME") or os.environ.get("USERPROFILE"))
debug = os.getenv("APP_DEBUG", "0") == "1" # значение по умолчанию
os.environ["APP_MODE"] = "test" # видно этому процессу и дочернимОбращение os.environ["KEY"] к несуществующей переменной вызовет KeyError, поэтому для необязательных настроек используют get() или getenv(). Значения всегда строки: число или булево значение нужно преобразовать самостоятельно. Изменения в os.environ не сохраняются в системе после завершения программы.
Система, процесс и запуск команд
Несколько атрибутов и функций сообщают, где и как запущена программа. По ним выбирают поведение, зависящее от платформы.
import os
print(os.name) # 'nt' в Windows, 'posix' в Linux и macOS
print(os.sep) # разделитель пути: '\\' или '/'
print(os.linesep) # перевод строки: '\r\n' или '\n'
print(os.cpu_count()) # число логических процессоров
print(os.getpid()) # идентификатор текущего процесса
token = os.urandom(16).hex() # случайные байты для ключейos.system("команда") запускает команду оболочки и возвращает код завершения, но не дает получить ее вывод. Для запуска внешних программ рекомендуется модуль subprocess: subprocess.run(["git", "status"], capture_output=True, text=True) возвращает и код, и текст вывода, а аргументы списком защищают от подстановки лишних команд.
Модуль os и соседние модули
Для части задач в стандартной библиотеке есть более удобные инструменты. Модуль os при этом остается основой: остальные построены поверх него.
| Задача | Модуль os | Удобнее |
|---|---|---|
| склеить и разобрать путь | os.path.join() | pathlib.Path |
| скопировать файл или папку | нет | shutil.copy2(), copytree() |
| удалить папку с содержимым | нет | shutil.rmtree() |
| найти файлы по маске | listdir() + проверка | glob, Path.glob() |
| запустить программу | os.system() | subprocess.run() |
Возможности копирования и архивации описаны в статье про shutil. Полный перечень функций os есть в официальной документации.
Частые вопросы
Короткие ответы на вопросы о модуле os.
Нужно ли устанавливать модуль os?
Нет, он входит в стандартную библиотеку Python и доступен сразу после установки интерпретатора. Команда pip install os не нужна.
Как узнать, в какой операционной системе запущен скрипт?
os.name различает только семейства nt и posix. Для точного ответа используйте sys.platform (win32, linux, darwin) или platform.system().
Чем os.remove отличается от os.unlink?
Ничем, это два имени одной функции. Обе удаляют файл и выбрасывают IsADirectoryError или PermissionError, если передать им папку.
Как получить путь к папке, где лежит скрипт?
os.path.dirname(os.path.abspath(__file__)). Текущий рабочий каталог из os.getcwd() может с ней не совпадать, если скрипт запущен из другой папки.