Модуль os (от англ. Operating System – операционная система) является одним из наиболее часто используемых модулей в Python. Он предоставляет программам возможность взаимодействовать с операционной системой (ОС), на которой они запущены.

Это означает, что с помощью модуля os вы можете выполнять те же операции, которые обычно делаете через командную строку или Проводник, но программно, прямо из вашего кода Python.

Главное преимущество модуля os заключается в его кроссплатформенности: он скрывает различия между операционными системами. Например, функция os.remove() удалит файл как в Windows, так и в Linux, хотя базовая системная команда для этого на этих ОС разная. Это позволяет писать код один раз, и он будет работать везде, где установлен Python.

Перед началом работы модуль os следует импортировать:

import os

Создание папки

Для создания новой папки в модуле os используются две основные функции: os.mkdir() и os.makedirs(). Выбор между ними зависит от того, нужно ли создать только одну папку в конце пути или в нём есть другие несуществующие папки.

Функция os.mkdir() используется только в том случае, если родительский каталог (папка, в которой создаётся новая папка) уже существует.

Функция

os.mkdir(path)

Описание

Создаёт последнюю папку в пути path

Параметры

  • path – абсолютный или относительный путь к создаваемой папке

Возвращаемое значение

None

Параметру path можно передать как абсолютный путь (начиная с буквы диска), так и относительный (от текущего скрипта). Например, если мы хотим создать новую папку в той же папке, в которой находится наша программа, достаточно передать функции os.mkdir() только её имя:

os.mkdir("data")

Этот код создаст в папке проекта новую папку data. Однако эта функция создаёт только последнюю папку в пути path, поэтому все остальные папки по этому пути должны существовать, иначе будет вызвано исключение FileNotFoundError:
 

os.mkdir("src/images")
# Ошибка: FileNotFoundError: [WinError 3] Системе не удается найти указанный путь: 'src/images'

Эту проблему решает функция os.makedirs(), которая создает все папки, необходимые для формирования указанного пути.

Функция

os.makedirs(path, exist_ok=False)

Описание

Создаёт все несуществующие папки в пути path

Параметры

  • path – абсолютный или относительный путь к создаваемой папке

Необязательные параметры:

  • exist_ok – определяет поведение при существовании последней папки в пути path. По умолчанию exist_ok=False, что вызывает исключение FileExistsError

Возвращаемое значение

None

Эта функция используется для создания сложных длинных путей или в случае, если вы не уверены, существуют ли все папки в пути path. Поэтому с её помощью создать папку images в несуществующей папке src:

os.makedirs("src/images")

Если создаваемая папка уже существует, то по умолчанию обе функции os.mkdir() и os.makedirs() вызовут исключение FileExistsError. Однако функция os.makedirs() позволяет изменить это поведение с помощью аргумента exist_ok=True:

os.makedirs("src/images", exist_ok=True)

Это гарантирует существование нужной папки.

Удаление папки

Модуль os предоставляет функцию os.rmdir(), которая удаляет пустую существующую папку.

Функция

os.rmdir(path)

Описание

Удаляет пустую папку по пути path

Параметры

  • path – путь к удаляемой папке

Возвращаемое значение

None

Этой функцией можно удалить папку, только если в ней нет ни файлов, ни других папок, то есть она абсолютно пустая. Например, мы можем удалить ранее созданную пустую папку data, но если в папке src/images будет хотя бы одно изображение, то будет вызвано исключение OSError:

os.rmdir("data")
# Папка удалена
os.rmdir("src/images")
# Ошибка: OSError: [WinError 145] Папка не пуста: 'src/images' 

Если нужно удалить папку со всем её содержимым (файлами и подпапками), необходимо использовать функцию shutil.rmtree() из модуля shutil (от англ. Shell Utilities – утилита командной оболочки). Он также является одним из модулей стандартной библиотеки, поэтому его можно импортировать без установки:

import shutil

Функция shutil.rmtree() рекурсивно обходит папку и удаляет всё содержимое, а затем удаляет и саму папку.

Функция

shutil.rmtree(path)

Описание

Удаляет папку вместе со всем содержимым по пути path

Параметры

  • path – путь к удаляемой папке

Возвращаемое значение

None

Операция удаления с помощью этой функции необратима, поэтому её следует использовать с осторожностью:

shutil.rmtree("src/images")
# Папка удалена

Переименование файла и папки

Для переименования или перемещения файлов и папок в модуле os представлена одна универсальная функция os.rename().

Функция

os.rename(src, dst)

Описание

Переименовывает или перемещает файл или папку, изменяя к ней путь с src на новый путь dst 

Параметры

  • src – исходное имя (путь) файла или папки
  • dst – новое имя (путь) файла или папки

Возвращаемое значение

None

Если исходный путь src и новый путь dst указывают на одну и ту же папку, функция выполняет переименование файла:

# Создадим новый файл calculations.txt
with open("data/calculations.txt", "w+", encoding="utf-8") as data:
    data.write("Записываем строку в новый файл")

# Переименовываем файл calculations.txt в results.txt
os.rename("data/calculations.txt", "data/results.txt")

Если новый путь dst указывает на другую папку по сравнению с исходным путем src, то функция выполняет перемещение файла в новую папку

os.rename("data/results.txt", "src/results.txt")
# Файл results.txt перемещён из папки data в папку src

Удаление файла

Если создание файла происходит при вызове встроенной функции open() с режимом записи или добавления ("w" или "a"), то его удаление осуществляется через функцию os.remove().

Функция

os.remove(path)

Описание

Удаляет файл по пути path

Параметры

  • path – путь, по которому удаляется файл

Возвращаемое значение

None

Не забывайте, что для удаления папок предназначены функции os.rmdir() и shutil.rmtree(), а функция os.remove() удаляет только файлы:

os.remove("src/results.txt")
# Файл results.txt удалён

Объединение путей

В разных операционных системах используются разные символы для разделения папок в пути:

  • Windows использует обратный слеш (\), например, C:\Users\Documents.
  • Linux и macOS используют прямой слеш (/), например, /home/user/documents.

Если вы будете вручную собирать путь, используя жестко заданный разделитель, ваш код будет работать только на той операционной системе, для которой вы его писали. Однако функция os.path.join() из подмодуля os.path автоматически использует правильный разделитель, специфичный для текущей операционной системы, чтобы соединить компоненты пути, переданные ей в качестве аргументов.

Функция

os.path.join(path, *paths)

Описание

Соединяет путь path с компонентами пути paths в один полный путь

Параметры

  • path – начальный путь
  • *paths – компоненты пути

Возвращаемое значение

Строка с полным путём

Эта функция принимает две или более строки, которые представляют части пути, и возвращает корректно сформированный путь:

result_path = os.path.join("reports", "2025", "summary.csv")
print(f"Результат: {result_path}")
# Вывод, если код запущен в Windows: reports\2025\summary.csv
# Вывод, если код запущен в Linux/macOS: reports/2025/summary.csv

Примеры

Пример 1. Создание структуры проекта

Функция create_project_structure(base_dir, sub_dirs) принимает корневую папку проекта base_dir и список подпапок sub_dirs, которые требуется создать внутри неё. Этот список содержит вложенные списки, каждый из которых задаёт путь к подпапке в виде последовательности папок. Функция автоматически создаёт как корневую папку проекта, так и все указанные вложенные папки, если они ещё не существуют:

import os

def create_project_structure(base_dir: str, sub_dirs: list) -> None:
    """Создает заданную многоуровневую структуру папок,
    гарантируя, что все необходимые родительские папки существуют.
    
    Параметры:
        base_dir: Корневая папка проекта.
        sub_dirs: Список относительных путей для создания.
    """
    # Создаем базовую папку, если она не существует
    os.makedirs(base_dir, exist_ok=True)
    
    for sub in sub_dirs:
        # os.path.join обеспечивает кросс-платформенную совместимость
        sub_path = os.path.join(*sub)
        full_path = os.path.join(base_dir, sub_path)
        os.makedirs(full_path, exist_ok=True)
        print(f"Создан путь: {full_path}")


folders = [
    ["input", "raw"],
    ["output", "processed"],
    ["logs", "daily"]
]

create_project_structure("project_analysis", folders)

Вывод:

Создан путь: project_analysis\input\raw
Создан путь: project_analysis\output\processed
Создан путь: project_analysis\logs\daily

Пример 2. Переименование файла

Функция rename_file(dir, old_name, prefix, index) переименовывает файл old_name в папке dir, добавляя ему префикс prefix и порядковый номер index:

import os

def rename_file(dir: str, old_name: str, prefix: str, index: int) -> None:
    """Переименовывает файл, добавляя к его имени префикс 
    и порядковый индекс.

    Параметры:
        dir: Папка, где находится файл.
        old_name: Текущее имя файла.
        prefix: Новый префикс для имени файла.
        index: Порядковый индекс для имени файла.
    """
    old_path = os.path.join(dir, old_name)
    new_name = f"{prefix}_{index:03}_{old_name}"
    new_path = os.path.join(dir, new_name)
    
    if not os.path.exists(old_path):
        print(f"Файл {old_path} не найден")
        return

    os.rename(old_path, new_path)
    print(f"Переименовано: {old_path} -> {new_path}")


# Создаём папку и файл для примера
os.makedirs("temp_files", exist_ok=True)
temp_path = os.path.join("temp_files", "data.csv")
with open(temp_path, "w") as data_file: 
    data_file.write("test")

# Переименовываем файл
rename_file("temp_files", "data.csv", "processed", 1)

Вывод:

Переименовано: temp_files\data.csv -> temp_files\processed_001_data.csv

Пример 3. Перемещение файла между папками

Функция move_file(src_dir, dst_dir, filename) перемещает файл filename из папки по пути src_dir в папку по пути dst_dir:

import os

def archive_file(work_dir: str, archive_dir: str, filename: str) -> None:
    """
    Перемещает файл из рабочей папки в архив.

    Параметры:
        work_dir: Папка с рабочими файлами.
        archive_dir: Папка архива.
        filename: Имя файла для перемещения.
    """
    src_path = os.path.join(work_dir, filename)
    dst_path = os.path.join(archive_dir, filename)

    if not os.path.exists(src_path):
        print(f"Файл не найден: {src_path}")
        return

    os.makedirs(archive_dir, exist_ok=True)
    os.rename(src_path, dst_path)

    print(f"Файл перемещён в архив: {dst_path}")
    

# Создаём папку и файл для примера
os.makedirs("reports", exist_ok=True)
file_dir = os.path.join("reports", "monthly_report.txt")
with open(file_dir, "w", encoding="utf-8") as report_file:
    report_file.write("Отчёт за месяц")

# Перемещаем файл в архив
archive_file("reports", "reports_archive", "monthly_report.txt")

Вывод:

Файл перемещён в архив: reports_archive/monthly_report.txt

Итоги

  • Модуль os предоставляет функции для взаимодействия с операционной системой.
  • Для создания новой папки в модуле os используются функции os.mkdir() и os.makedirs(). Первая используется только если родительская папка уже существует, а вторая создаёт все несуществующие папки, необходимые для формирования пути к создаваемой папке.
  • Функция os.rmdir() удаляет пустую существующую папку.
  • Функция shutil.rmtree() рекурсивно обходит папку и удаляет всё содержимое, а затем удаляет и саму папку.
  • Функция os.rename() переименовывает файлы и папки или перемещает их, если изменяется путь. есть изменяет путь объекта с одного на другой.
  • Функция os.remove() удаляет файл.

Задания для самопроверки

1. В чём заключается различие между функциями os.mkdir() и os.makedirs()?

Функция os.mkdir() создаёт только последнюю папку в пути, а функция os.makedirs() может создать все несуществующие папки, необходимые для формирования пути.

2. Как в Python удалить папку вместе со всем её содержимым?

Нужно воспользоваться функцией shutil.rmtree(), которая рекурсивно обходит папку и удаляет всё содержимое, а затем удаляет и саму папку.

3. Используя функции модуля os, создайте папку с именем logs, а затем удалите её. После каждой операции выводите на экран сообщение с её описанием.

import os

# Создадим папку
folder_name = "logs"
os.mkdir("logs")
print(f"Папка '{folder_name}' успешно создана")
# Вывод: Папка 'logs' успешно создана

# Удалим папку
os.rmdir(folder_name)
print(f"Папка '{folder_name}' успешно удалена")
# Вывод: Папка 'logs' успешно удалена

4. Программно создайте файл с именем config_old.ini, затем с помощью одной из функций модуля os переименуйте этот файл в config.ini.

import os

with open("config_old.ini", 'w') as config:
    pass

os.rename("config_old.ini", "config.ini")

5. Напишите функцию delete_dir(path), которая удаляет папку по пути path. В этой функции должен быть определён блок try/except для перехвата исключений и, если удаление папки не было выполнено, то на экран выводится строка с информацией о возникшем исключении. Вызовите эту функцию для несуществующей папки.

import shutil

def delete_dir(path: str) -> None:
    try:
        shutil.rmtree(path)
        print(f"Папка '{path}' успешно удалена")
    except Exception as e:
        print(f"Возникло исключение: {e})")


delete_dir("non_existent_path")
# Вывод: Возникло исключение: [Errno 2] No such file or directory: 'non_existent_path')