Привет! Ты уже умеешь читать и записывать файлы. Но что, если нужно переименовать файл? Или удалить? А может, проверить, существует ли папка, прежде чем создавать новую? Для всего этого есть встроенный модуль os.
В этой статье мы разберём:
- Как переименовывать файлы и папки
- Как удалять файлы и папки
- Как проверять существование файлов и папок
- Как работать с путями
- Практические примеры
- Что нужно знать перед началом
- Основная часть
- Импорт модуля os
- Работа с путями
- Объединение путей: os.path.join()
- Абсолютный путь: os.path.abspath()
- Разбор пути: os.path.dirname() и os.path.basename()
- Разделение имени и расширения: os.path.splitext()
- Проверка существования: os.path.exists()
- Проверка типа: файл или папка
- Проверка на файл: os.path.isfile()
- Проверка на папку: os.path.isdir()
- Переименование: os.rename()
- Удаление файлов: os.remove()
- Удаление папок
- Удаление пустой папки: os.rmdir()
- Удаление папки со всем содержимым: shutil.rmtree()
- Практические примеры
- Массовое переименование файлов
- Удаление всех .tmp файлов в папке
- Проверка и создание папки
- Получение списка файлов: os.listdir()
- Разделение на файлы и папки
- Полный пример: резервное копирование
- os.walk() — обход папок рекурсивно
- Задачи для закрепления
- Нюансы и подводные камни
- Кроссплатформенность
- Ошибка при переименовании
- Безвозвратное удаление
- Частые ошибки и как их избежать
- Ошибка 1: Неправильное объединение путей
- Ошибка 2: Удаление без проверки
- Ошибка 3: os.remove() для папки
- Шпаргалка
- Заключение
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Python (модуль os встроенный)
- Базовое понимание файловой системы
- Желание автоматизировать работу с файлами
Совет: Модуль
os— это мост между Python и операционной системой. С его помощью ты можешь делать то же, что и в проводнике/файловом менеджере, но программно.
Основная часть
Импорт модуля os
import os
# Проверяем текущую рабочую директорию
print(os.getcwd())Совет:
os.getcwd()возвращает текущую папку, в которой работает скрипт. Это полезно для проверки, где создаются файлы.
Работа с путями
Объединение путей: os.path.join()
# Правильный способ объединить путь
path = os.path.join('folder', 'subfolder', 'file.txt')
print(path) # folder/subfolder/file.txt (на Linux/Mac)
# folder\subfolder\file.txt (на Windows)Совет: Всегда используй
os.path.join()вместо ручного добавления слешей. Это гарантирует правильные разделители для твоей ОС.
Абсолютный путь: os.path.abspath()
# Получаем абсолютный путь
relative_path = 'file.txt'
absolute_path = os.path.abspath(relative_path)
print(absolute_path) # /home/user/file.txt или C:\Users\user\file.txtРазбор пути: os.path.dirname() и os.path.basename()
path = '/home/user/documents/file.txt'
# Папка, в которой лежит файл
print(os.path.dirname(path)) # /home/user/documents
# Имя файла
print(os.path.basename(path)) # file.txtРазделение имени и расширения: os.path.splitext()
filename = 'report_2024.xlsx'
name, extension = os.path.splitext(filename)
print(f"Имя: {name}, расширение: {extension}")
# Имя: report_2024, расширение: .xlsxСовет:
splitext()полезен для массового переименования файлов с сохранением расширения.
Проверка существования: os.path.exists()
# Проверяем, существует ли файл
if os.path.exists('data.txt'):
print("Файл существует!")
else:
print("Файл не найден")Совет: Всегда проверяй существование файла перед удалением или чтением — это предотвращает ошибки.
Проверка типа: файл или папка
Проверка на файл: os.path.isfile()
if os.path.isfile('data.txt'):
print("Это файл")Проверка на папку: os.path.isdir()
if os.path.isdir('my_folder'):
print("Это папка")Переименование: os.rename()
Переименовывает файл или папку:
# Переименовываем файл
os.rename('old_name.txt', 'new_name.txt')
# Переименовываем папку
os.rename('old_folder', 'new_folder')Совет: Если файл с новым именем уже существует, будет ошибка. Проверяй заранее!
Удаление файлов: os.remove()
# Удаляем файл
if os.path.exists('temp_file.txt'):
os.remove('temp_file.txt')
print("Файл удалён")
else:
print("Файл не найден")Совет:
os.remove()удаляет только файлы. Для удаления папок используй другие методы.
Удаление папок
Удаление пустой папки: os.rmdir()
# Удаляет только пустую папку
if os.path.exists('empty_folder'):
os.rmdir('empty_folder')
print("Пустая папка удалена")Удаление папки со всем содержимым: shutil.rmtree()
import shutil
# Удаляет папку и всё внутри (ОСТОРОЖНО!)
shutil.rmtree('my_folder')
print("Папка и всё содержимое удалены")Совет: Будь осторожен с
shutil.rmtree()— он удаляет безвозвратно! Всегда проверяй, что удаляешь именно то, что нужно.
Практические примеры
Массовое переименование файлов
import os
def rename_files_in_folder(folder_path, prefix, extension):
"""
Переименовывает все файлы с заданным расширением
добавляя префикс к имени
"""
for filename in os.listdir(folder_path):
# Проверяем расширение
if filename.endswith(extension):
old_path = os.path.join(folder_path, filename)
new_name = f"{prefix}_{filename}"
new_path = os.path.join(folder_path, new_name)
os.rename(old_path, new_path)
print(f"Переименован: {filename} -> {new_name}")
# Использование
rename_files_in_folder('./images', 'IMG', '.jpg')Удаление всех .tmp файлов в папке
import os
def delete_temp_files(folder_path):
"""Удаляет все файлы с расширением .tmp в папке"""
deleted_count = 0
for filename in os.listdir(folder_path):
if filename.endswith('.tmp'):
file_path = os.path.join(folder_path, filename)
try:
os.remove(file_path)
deleted_count += 1
print(f"Удалён: {filename}")
except Exception as e:
print(f"Ошибка при удалении {filename}: {e}")
print(f"Удалено {deleted_count} временных файлов")
# Использование
delete_temp_files('./downloads')Проверка и создание папки
import os
def ensure_folder_exists(folder_path):
"""Создаёт папку, если её нет"""
if os.path.exists(folder_path):
print(f"Папка {folder_path} уже существует")
return True
else:
os.makedirs(folder_path)
print(f"Папка {folder_path} создана")
return True
# Использование
ensure_folder_exists('./output/reports/2024')Совет:
os.makedirs()создаёт все промежуточные папки в пути, в отличие отos.mkdir()(создаёт только последнюю).
Получение списка файлов: os.listdir()
# Получаем список всех файлов и папок в директории
items = os.listdir('.')
print("Содержимое папки:")
for item in items:
print(f" {item}")Разделение на файлы и папки
def list_folder_contents(folder_path):
files = []
folders = []
for item in os.listdir(folder_path):
item_path = os.path.join(folder_path, item)
if os.path.isfile(item_path):
files.append(item)
elif os.path.isdir(item_path):
folders.append(item)
print("Файлы:")
for f in files:
print(f" 📄 {f}")
print("\nПапки:")
for f in folders:
print(f" 📁 {f}")
# Использование
list_folder_contents('.')Полный пример: резервное копирование
import os
import shutil
from datetime import datetime
def backup_folder(source_folder, backup_folder):
"""
Создаёт резервную копию папки с меткой времени
"""
# Проверяем, что исходная папка существует
if not os.path.exists(source_folder):
print(f"Ошибка: папка {source_folder} не найдена")
return
# Создаём имя для бэкапа с датой
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup_name = f"{os.path.basename(source_folder)}_backup_{timestamp}"
backup_path = os.path.join(backup_folder, backup_name)
try:
# Создаём копию
shutil.copytree(source_folder, backup_path)
print(f"Резервная копия создана: {backup_path}")
# Проверяем, что создано
if os.path.exists(backup_path):
print(f"Размер бэкапа: {get_folder_size(backup_path):.2f} MB")
except Exception as e:
print(f"Ошибка при создании бэкапа: {e}")
def get_folder_size(folder_path):
"""Вычисляет размер папки в байтах"""
total_size = 0
for dirpath, dirnames, filenames in os.walk(folder_path):
for filename in filenames:
file_path = os.path.join(dirpath, filename)
total_size += os.path.getsize(file_path)
return total_size / (1024 * 1024) # В MB
# Использование
backup_folder('./projects', './backups')os.walk() — обход папок рекурсивно
import os
def find_all_txt_files(start_folder):
"""Находит все .txt файлы в папке и подпапках"""
txt_files = []
for root, dirs, files in os.walk(start_folder):
for file in files:
if file.endswith('.txt'):
full_path = os.path.join(root, file)
txt_files.append(full_path)
print(f"Найден: {full_path}")
return txt_files
# Использование
all_txt = find_all_txt_files('.')
print(f"\nВсего найдено {len(all_txt)} .txt файлов")Совет:
os.walk()рекурсивно обходит все папки и подпапки. Это незаменимо для работы с большими файловыми структурами.
Задачи для закрепления
Задача 1. Проверь, существует ли файл data.txt.
Задача 2. Переименуй файл old.txt в new.txt.
Задача 3. Удали файл temp.txt.
Задача 4. Проверь, является ли my_folder папкой.
Задача 5. Создай папку new_folder, если её нет.
Ответы:
Задача 1.
import os
if os.path.exists('data.txt'):
print("Файл существует")
else:
print("Файл не найден")Задача 2.
os.rename('old.txt', 'new.txt')Задача 3.
if os.path.exists('temp.txt'):
os.remove('temp.txt')Задача 4.
if os.path.isdir('my_folder'):
print("Это папка")Задача 5.
if not os.path.exists('new_folder'):
os.makedirs('new_folder')Нюансы и подводные камни
Кроссплатформенность
Разделители путей разные на разных ОС:
- Windows:
\ - Linux/Mac:
/
Всегда используй os.path.join() для создания путей.
Ошибка при переименовании
os.rename() вызовет ошибку, если целевой файл уже существует:
import os
try:
os.rename('file1.txt', 'file2.txt')
except FileExistsError:
print("Файл file2.txt уже существует")Безвозвратное удаление
os.remove() и shutil.rmtree() удаляют файлы безвозвратно (в отличие от корзины). Будь осторожен!
Частые ошибки и как их избежать
Ошибка 1: Неправильное объединение путей
# Плохо (не работает на разных ОС)
path = folder + '/' + filename
# Хорошо
path = os.path.join(folder, filename)Ошибка 2: Удаление без проверки
# Ошибка, если файла нет
os.remove('file.txt')
# С проверкой
if os.path.exists('file.txt'):
os.remove('file.txt')Ошибка 3: os.remove() для папки
# Ошибка — os.remove() удаляет только файлы
os.remove('my_folder')
# Для папок
os.rmdir('empty_folder') # только пустую
shutil.rmtree('my_folder') # с содержимымШпаргалка
| Что нужно | Как пишется |
|---|---|
| Текущая папка | os.getcwd() |
| Объединить путь | os.path.join('a', 'b', 'c') |
| Абсолютный путь | os.path.abspath('file.txt') |
| Проверить существование | os.path.exists('file.txt') |
| Проверить, что это файл | os.path.isfile('file.txt') |
| Проверить, что это папка | os.path.isdir('folder') |
| Переименовать | os.rename('old', 'new') |
| Удалить файл | os.remove('file.txt') |
| Удалить пустую папку | os.rmdir('folder') |
| Удалить папку со всем содержимым | shutil.rmtree('folder') |
| Список файлов в папке | os.listdir('.') |
| Создать папку | os.mkdir('folder') |
| Создать все промежуточные папки | os.makedirs('a/b/c') |
| Обойти все папки рекурсивно | os.walk('.') |
Заключение
Сегодня мы научились:
- Проверять существование файлов и папок
- Переименовывать файлы и папки
- Удалять файлы и папки
- Работать с путями (
join,abspath,dirname) - Получать списки файлов
- Обходить папки рекурсивно








