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 и выполните четыре маленькие задачи
- Выведите текущую рабочую папку
- Создайте папку
reports - Сохраните в нее файл
result.txt - Выведите список файлов внутри
reports
Затем усложните пример: добавьте проверку, чтобы скрипт не падал при повторном запуске
Модуль os в Python помогает работать с системой: путями, папками, файлами и переменными окружения
Для уверенного старта достаточно освоить os.getcwd(), os.listdir(), os.path.join(), os.path.exists(), os.makedirs(), os.getenv() и os.walk()
Главное правило для новичка: сначала выводите, что скрипт собирается сделать, и только после проверки добавляйте действия, которые меняют или удаляют файлы