Модуль os: переименование, удаление, проверка существования файлов

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

Привет! Ты уже умеешь читать и записывать файлы. Но что, если нужно переименовать файл? Или удалить? А может, проверить, существует ли папка, прежде чем создавать новую? Для всего этого есть встроенный модуль os.

В этой статье мы разберём:

  • Как переименовывать файлы и папки
  • Как удалять файлы и папки
  • Как проверять существование файлов и папок
  • Как работать с путями
  • Практические примеры
Содержание
  1. Что нужно знать перед началом
  2. Основная часть
  3. Импорт модуля os
  4. Работа с путями
  5. Объединение путей: os.path.join()
  6. Абсолютный путь: os.path.abspath()
  7. Разбор пути: os.path.dirname() и os.path.basename()
  8. Разделение имени и расширения: os.path.splitext()
  9. Проверка существования: os.path.exists()
  10. Проверка типа: файл или папка
  11. Проверка на файл: os.path.isfile()
  12. Проверка на папку: os.path.isdir()
  13. Переименование: os.rename()
  14. Удаление файлов: os.remove()
  15. Удаление папок
  16. Удаление пустой папки: os.rmdir()
  17. Удаление папки со всем содержимым: shutil.rmtree()
  18. Практические примеры
  19. Массовое переименование файлов
  20. Удаление всех .tmp файлов в папке
  21. Проверка и создание папки
  22. Получение списка файлов: os.listdir()
  23. Разделение на файлы и папки
  24. Полный пример: резервное копирование
  25. os.walk() — обход папок рекурсивно
  26. Задачи для закрепления
  27. Нюансы и подводные камни
  28. Кроссплатформенность
  29. Ошибка при переименовании
  30. Безвозвратное удаление
  31. Частые ошибки и как их избежать
  32. Ошибка 1: Неправильное объединение путей
  33. Ошибка 2: Удаление без проверки
  34. Ошибка 3: os.remove() для папки
  35. Шпаргалка
  36. Заключение
  37. КВИЗ
  38. Что дальше?

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный 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('.')

Заключение

Сегодня мы научились:

  • Проверять существование файлов и папок
  • Переименовывать файлы и папки
  • Удалять файлы и папки
  • Работать с путями (joinabspathdirname)
  • Получать списки файлов
  • Обходить папки рекурсивно

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×