Python

Модуль os в Python: файлы, папки и пути

Модуль os нужен, когда Python-скрипту нужно узнать текущую папку, пройтись по файлам, создать директорию, прочитать переменную окружения или собрать путь так, чтобы код работал на Windows, macOS и Linux

В новых проектах для путей часто удобнее pathlib, но os по-прежнему встречается в инструкциях, старом коде, автоматизации и серверных скриптах. Поэтому полезно понимать базовые команды и типичные ловушки

Что умеет модуль os

os связывает Python с операционной системой. Через него можно:

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

Это не модуль только про файлы. Он часто используется в настройках приложений, деплое, скриптах очистки, обработке выгрузок и проектах, где один и тот же код должен запускаться на разных системах

Текущая папка и папка скрипта

Первая важная вещь: текущая рабочая папка не всегда равна папке, где лежит файл скрипта

import os

print(os.getcwd())

os.getcwd() показывает папку, из которой вы запустили команду python script.py

Если открыть терминал в другой директории, результат изменится. Именно поэтому код с относительными путями иногда работает в редакторе, но ломается при запуске из cron, Docker, панели хостинга или другого терминала

Получить список файлов

Самый короткий способ посмотреть содержимое папки:

import os

for name in os.listdir('.'):
    print(name)

Точка '.' означает текущую папку. В вывод попадут и файлы, и папки

Если нужно отличать одно от другого, добавьте проверку:

import os

for name in os.listdir('.'):
    if os.path.isfile(name):
        print(f'файл: {name}')
    elif os.path.isdir(name):
        print(f'папка: {name}')

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

Собрать путь правильно

Не склеивайте путь через +

path = 'reports' + '/' + 'june.txt'

На одной системе это может сработать, а на другой быстро превратится в источник ошибок. Надежнее использовать os.path.join

import os

path = os.path.join('reports', 'june.txt')
print(path)

Python сам подставит подходящий разделитель пути для системы

Для современных проектов можно писать через pathlib, но если в коде уже используется os, os.path.join остается нормальным рабочим вариантом

Проверить, существует ли файл

Перед чтением файла полезно проверить путь:

import os

path = os.path.join('data', 'users.csv')

if os.path.exists(path):
    print('файл найден')
else:
    print('файла нет')

Если нужно убедиться, что это именно файл:

import os

path = os.path.join('data', 'users.csv')

if os.path.isfile(path):
    print('можно читать файл')

Для папки используйте os.path.isdir(path)

Создать папку

Для одной папки подходит os.mkdir

import os

os.mkdir('reports')

Но если папка уже существует, будет ошибка. В практических скриптах чаще используют os.makedirs с exist_ok=True

import os

os.makedirs('reports/2026/june', exist_ok=True)

Такой код создаст все промежуточные папки и не упадет, если путь уже есть

Пример: создать папку и сохранить файл

import os

folder = os.path.join('reports', 'june')
os.makedirs(folder, exist_ok=True)

file_path = os.path.join(folder, 'summary.txt')

with open(file_path, 'w', encoding='utf-8') as file:
    file.write('Готов отчет за июнь')

print(f'сохранено: {file_path}')

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

По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы

По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы

Переменные окружения

os.getenv() часто используют для настроек, которые не хотят хранить прямо в коде: токены, режим запуска, адрес базы, ключ API

import os

mode = os.getenv('APP_MODE', 'dev')
print(f'режим запуска: {mode}')

Второй аргумент — значение по умолчанию. Если переменной APP_MODE нет, Python вернет 'dev'

Для секретов лучше не задавать опасное значение по умолчанию:

import os

token = os.getenv('BOT_TOKEN')

if not token:
    raise RuntimeError('Не задана переменная окружения BOT_TOKEN')

Так ошибка появится сразу, а не в середине запроса к сервису

Пройтись по вложенным папкам

os.walk() нужен, когда нужно обработать дерево каталогов

import os

for root, dirs, files in os.walk('data'):
    for file_name in files:
        path = os.path.join(root, file_name)
        print(path)

root — текущая папка обхода, dirs — вложенные папки, files — файлы внутри нее

Так можно искать все .txt, .csv, .jpg, логи или временные файлы

import os

for root, dirs, files in os.walk('data'):
    for file_name in files:
        if file_name.endswith('.csv'):
            print(os.path.join(root, file_name))

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

Удаление лучше добавлять последним шагом, когда вывод уже проверен глазами

import os

path = os.path.join('tmp', 'old.txt')

if os.path.isfile(path):
    os.remove(path)
    print('файл удален')
else:
    print('удалять нечего')

os.remove() удаляет файл, но не папку. Для пустой папки есть os.rmdir(). Для непустых папок нужен другой подход, обычно через shutil.rmtree, и с ним надо быть особенно аккуратным

os и pathlib

Если вы пишете новый небольшой скрипт, часто приятнее использовать pathlib

from pathlib import Path

path = Path('reports') / 'june.txt'
print(path.exists())

Но os все равно важно знать по двум причинам. Во-первых, много готовых примеров написано именно через os. Во-вторых, переменные окружения, текущая папка и часть системных операций все еще часто читаются через этот модуль

Практичный подход простой: для путей в новом коде можно брать pathlib, а при чтении старого кода спокойно понимать os.path

Частые ошибки

  • ожидать, что os.getcwd() всегда покажет папку скрипта
  • склеивать пути строками через / или +
  • удалять файлы без предварительного вывода списка
  • путать файл и папку
  • забывать exist_ok=True при создании вложенных директорий
  • хранить токены прямо в коде вместо переменных окружения
  • запускать скрипт из другой папки и удивляться, что относительный путь изменился

Практика

Создайте файл practice_os.py и выполните четыре маленькие задачи

  1. Выведите текущую рабочую папку
  2. Создайте папку reports
  3. Сохраните в нее файл result.txt
  4. Выведите список файлов внутри reports

Затем усложните пример: добавьте проверку, чтобы скрипт не падал при повторном запуске

Модуль os в Python помогает работать с системой: путями, папками, файлами и переменными окружения

Для уверенного старта достаточно освоить os.getcwd(), os.listdir(), os.path.join(), os.path.exists(), os.makedirs(), os.getenv() и os.walk()

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

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x