tariel.ge › Полезное: бесплатные книги › Программирование: от нулей и единиц до PythonБесплатно · автор Тариел Бежанидзе
← Учебник по программированию ЛИСТ 23БЛОК 4 — PYTHON НА ПРАКТИКЕ · ФИНАЛРЕВ. 1
Глава 23 · Python на практике

Скрипты автоматизации: переименование файлов, парсинг текста

Финал блока — два полноценных рабочих скрипта, не учебные обрывки, а код, который реально можно запустить и использовать. Здесь сходится вместе почти всё, что было в блоках 3 и 4.

Важный принцип безопасности перед первым скриптом

Сухой прогон (dry run) — обязательная привычка

Команды rm (глава 09) и del (глава 10) необратимы — то же самое верно и для переименования или удаления файлов из Python-кода. Хорошая практика для любого автоматизирующего скрипта — сначала вывести на экран, что именно будет сделано, дать возможность просмотреть список изменений, и только после явного подтверждения выполнить реальные действия. Оба скрипта этой главы следуют этому принципу.

Скрипт 1 — массовое переименование файлов по маске

from pathlib import Path
import sys

def rename_photos(folder_path, prefix="photo", dry_run=True):
    """Переименовывает все .jpg файлы в папке в формат prefix_001.jpg и т.д."""
    folder = Path(folder_path)
    if not folder.exists():
        print(f"Папка {folder_path} не найдена")
        return

    files = sorted(folder.glob("*.jpg"))
    if not files:
        print("Файлы .jpg не найдены")
        return

    for i, file in enumerate(files, start=1):
        new_name = file.parent / f"{prefix}_{i:03d}.jpg"
        if dry_run:
            print(f"[СУХОЙ ПРОГОН] {file.name} → {new_name.name}")
        else:
            try:
                file.rename(new_name)
                print(f"Переименован: {file.name} → {new_name.name}")
            except OSError as e:
                print(f"Ошибка при переименовании {file.name}: {e}")

if __name__ == "__main__":
    rename_photos("photos", dry_run=True) # сначала проверь вывод, потом смени на False

Что здесь используется из предыдущих глав: pathlib и обход файлов (глава 22), f-строки с форматированием чисел (глава 14), функция с параметрами по умолчанию (глава 16), docstring (глава 16), обработка ошибки OSError — например, если файл занят другой программой (глава 21), и явная защита от несуществующей папки или отсутствия подходящих файлов перед тем, как вообще пытаться что-то сделать.

Скрипт 2 — анализ текстового лог-файла

from pathlib import Path

def analyze_log(log_path):
    """Подсчитывает количество строк каждого уровня (ERROR, WARNING, INFO) в лог-файле."""
    counts = {}

    try:
        with open(log_path, encoding="utf-8") as f:
            for line in f:
                parts = line.strip().split(" ")
                if len(parts) < 2:
                    continue # пропускаем пустые/неполные строки
                level = parts[1] # предполагаем формат: ВРЕМЯ УРОВЕНЬ сообщение...
                counts[level] = counts.get(level, 0) + 1
    except FileNotFoundError:
        print(f"Лог-файл {log_path} не найден")
        return

    for level, count in sorted(counts.items(), key=lambda item: item[1], reverse=True):
        print(f"{level}: {count}")

if __name__ == "__main__":
    analyze_log("app.log")

Здесь в работе: чтение файла построчно (глава 19), .strip() и .split() (глава 18), словарь как счётчик с методом .get() (безопасное чтение значения с запасным по умолчанию, глава 17), обработка FileNotFoundError (глава 21), и сортировка результата по значению — маленькая лямбда-функция, о которой мельком упоминалось в конце главы 16, здесь применена на деле.

Аргументы командной строки — параметризация скрипта

Оба скрипта выше вызывают функцию с "зашитыми в код" значениями ("photos", "app.log"). Для настоящего многократно используемого инструмента удобнее принимать путь как параметр запуска из терминала:

import sys

if __name__ == "__main__":
    analyze_log(sys.argv[1]) # первый аргумент после имени скрипта
$ python3 log_analyzer.py app.log

sys.argv — список аргументов, с которыми была запущена программа из терминала (глава 09–12); нулевой элемент — имя самого скрипта, первый и далее — то, что реально передано после него. Это прямой шаг к теме финального проекта книги (глава 27) — полноценному инструменту командной строки.

Итог блока «Python на практике»

Четыре главы — от установки пакетов до полноценных рабочих скриптов — закрыли путь от "знаю синтаксис" до "умею написать что-то реально полезное". Финальный блок книги выходит за пределы процедурного программирования, знакомого с глав про BASIC и Pascal, — к объектно-ориентированному подходу, инструменту версионирования кода и мосту обратно к твоему собственному миру электроники.

Глава23 — Скрипты автоматизации
Блок4 — Python на практике — финал
Далее24 — Основы ООП
СтатусГотово · рев. 1
Предыдущая глава ← 22 · Файловая система из Python Следующая глава 24 · Основы ООП →

Книга бесплатна для чтения. Автор — Тариел Бежанидзе, компьютерный мастер в Батуми · tariel.ge · все бесплатные книги. Копировать текст целиком на другие сайты — только со ссылкой на источник.