Когда только начинаешь кодить, многое приходится делать вручную: переименовывать файлы, проверять данные, снова и снова запускать тест. Это нормально, но рано или поздно приходит мысль: «А можно ли сделать так, чтобы всё работало само?» 

Всё, конечно, не заработает, но Python заметно сокращает рутину. Например, с его помощью можно скачивать файлы, отправлять отчёты, проверять API, заходить в браузер и кликать по кнопкам. Если какое-то действие приходится выполнять слишком часто — значит, пора его автоматизировать.

Для новичков автоматизация — это хороший способ разобраться, как данные, программы и процессы взаимодействуют между собой. Для более опытных программистов — ускорить работу и сосредоточиться на сложных задачах. 

В статье разбираю полезные скрипты — от работы с файлами до DevOps. В каждом разделе есть примеры для начинающих и для тех, кто уже использует Python в работе. А в конце — несколько простых правил, которые помогут писать удобный и надёжный код.

Статью внимательно проверил бэкенд-разработчик на Python Игорь Мартюшев. 

Для навигации:

  1. Как писать скрипты для автоматизации

  2. Работа с файлами и проектами

  3. Работа с данными и отчётами

  4. Автоматизация тестирования

  5. Автоматизация DevOps и CI/CD

  6. Правила хорошего кода

Как писать скрипты для автоматизации

Сначала разберём простой алгоритм написания скриптов для автоматизации. Он помогает структурировать код, делает его гибким и упрощает отладку:

  • если что-то не работает, легко найти этап, где возникла ошибка;

  • можно менять отдельные шаги, не переписывая весь код;

  • один и тот же подход можно применять к разным задачам.

1. Определяем входные и выходные данные.

Чётко формулируем, что именно нужно обработать, откуда берутся данные и какой результат должен получиться.

Например:

  • нужно автоматизировать скачивание отчётов из API и их конвертацию в Excel;

  • вход — ответ API в формате JSON;

  • выход — файл report.xlsx с таблицей.

2. Выбираем инструменты.

Определяем, какие модули и библиотеки понадобятся для решения задачи.

Примеры:

  • работа с файлами → встроенные модули os, shutil;

  • запросы к API → библиотека Requests;

  • работа с Excel → библиотека pandas (для анализа данных) и модуль openpyxl (для работы с файлами Excel).

3. Разбиваем задачу на три этапа.

Первый — загрузка данных. 

Сначала определяем, откуда брать информацию. Например:

  • файл (CSV, Excel, JSON) — открыть и прочитать содержимое;

  • API — отправить запрос и получить ответ от сервера;

  • веб-страница — загрузить код и извлечь нужные данные.

Второй — обработка данных.

Когда данные загружены, их нужно привести в удобный вид. В зависимости от задачи это может быть:

  • очистка от пустых значений или лишних символов;

  • преобразование формата — например, из JSON в таблицу;

  • переименование файлов, изменение структуры папок.

Здесь важно понимать, что должно получиться в итоге, — например, готовый отчёт или чистый список данных.

Третий — сохранение результата. 

После обработки данные необходимо сохранить в нужном виде. Это может быть:

  • запись в файл (CSV, Excel, JSON, текстовый документ);

  • отправка на сервер или в базу данных;

  • вывод в консоль (если нужен быстрый результат).

4. Проверяем код.

Последний шаг — убедиться, что скрипт работает как надо. Для этого проверяем:

  • Нет ли сбоев: запускаем скрипт и смотрим, выполняется ли он до конца. Если что-то идёт не так, анализируем сообщение об ошибке.

  • Обрабатывает ли скрипт разные случаи: тестируем его на разных данных. Например, если работаем с файлами, проверяем, что будет при пустом файле или изменённой структуре.

  • Что происходит при сбоях: если API не отвечает или файл отсутствует, скрипт должен не останавливаться, а выводить понятное сообщение о проблеме. 

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

После тестирования вносим финальные правки, чтобы скрипт работал стабильно в любых условиях.

А теперь разберём примеры для разных задач.

Работа с файлами и проектами

Базовые скрипты

Массовое переименование файлов: os, glob, pathlib

Скрипт находит файлы в папке и переименовывает их по заданному шаблону: добавляет дату, порядковый номер, меняет расширение или удаляет лишние символы.

Где пригодится

  • Приведение файлов к единому формату в проектах.

  • Добавление даты к логам и журналам.

  • Упорядочивание загруженных файлов (изображений, документов, CSV).

Как использовать

Выбираем папку, задаём правило переименования и запускаем скрипт.

Какой инструмент выбрать

  • Os — классический вариант с большим контролем. Удобен для сложных условий.

  • Pathlib — современный и лаконичный инструмент для работы с путями. Но он не умеет управлять процессами и системными настройками.

Вот примеры для обоих случаев. 

Пример с os

import os 
import datetime 

folder_path = "папка_с_файлами" 
if not os.path.exists(folder_path):  # Добавляем проверку существования папки
    print(f"Папка {folder_path} не найдена.")
    exit()

for filename in os.listdir(folder_path): 
    old_path = os.path.join(folder_path, filename) 
    if os.path.isfile(old_path):  
        file_name, file_ext = os.path.splitext(filename) 
        date_str = datetime.datetime.now().strftime("%Y-%m-%d") 
        new_name = f"{file_name.replace(' ', '_')}_{date_str}{file_ext}" 
        new_path = os.path.join(folder_path, new_name) 
        try:  # Добавляем блок try-except для обработки ошибок при переименовании
            os.rename(old_path, new_path)
        except Exception as e:
            print(f"Ошибка при переименовании файла {filename}: {e}")

Пример с pathlib

from pathlib import Path

folder_path = "папка_с_файлами" 

for file in folder.iterdir():
    if file.is_file():
        new_name = file.stem.replace(" ", "_") + file.suffix  # Убираем лишнее "_"
        file.rename(folder / new_name)

Иногда вместе с os используют glob, чтобы искать файлы по шаблону. Допустим, нужно переименовать только файлы с расширением .txt. Тогда скрипт будет выглядеть так:

import os
import glob

folder_path = "папка_с_файлами"

for file_path in glob.glob(os.path.join(folder_path, "*.txt")):  # Ищем только файлы .txt
    file_name, file_ext = os.path.splitext(os.path.basename(file_path))
    new_name = f"{file_name}_backup{file_ext}"
    new_path = os.path.join(folder_path, new_name)
    os.rename(file_path, new_path)

К содержанию

Автоматическое копирование и удаление файлов: shutil, os

Скрипт копирует файлы в указанную папку, сохраняя их содержимое. Если это нужно для задачи, можно настроить удаление оригиналов. Работает с одиночными файлами и целыми директориями.

Для копирования используют shutil.copy(), а для удаления — os.remove().

Где пригодится

  • Создание резервных копий файлов перед изменением или удалением.

  • Автоматическая архивация важных документов в отдельную папку.

  • Очистка временных файлов после обработки данных.

  • Подготовка файлов перед загрузкой в облако или на сервер.

Как использовать

Допустим, есть папка с документами и нужно копировать их в резервную директорию, а затем удалять оригиналы. Делаем это так:

import shutil
import os

source_folder = "оригинальные_файлы"
backup_folder = "резервная_копия"

# Создаём папку для резервных копий, если её нет
os.makedirs(backup_folder, exist_ok=True)

# Копируем файлы и удаляем оригиналы
for filename in os.listdir(source_folder):
    source_path = os.path.join(source_folder, filename)
    backup_path = os.path.join(backup_folder, filename)
    
    # Проверяем, что это файл, а не папка
    if os.path.isfile(source_path):
        try:
            shutil.copy(source_path, backup_path)
            
            # Добавляем проверку существования скопированного файла
            if os.path.exists(backup_path):
                os.remove(source_path)  # Удаляем, только если копирование прошло успешно
            else:
                print(f"Ошибка: Файл {filename} не был успешно скопирован.")
                
        except Exception as e:
            print(f"Ошибка при копировании {filename}: {e}")

К содержанию

Создание структуры проекта: os.makedirs()

Создаёт папки и вложенные директории, если их нет. Помогает сразу задать структуру проекта, например, с папками для кода, данных и настроек.

Где пригодится

  • Быстрое создание шаблонов проектов, чтобы не настраивать вручную.

  • Разделение кода, данных, логов и отчётов по папкам.

  • Автоматическая подготовка структуры перед запуском скриптов.

Как использовать

Допустим, нужно создать проект с такими папками:

  • src — код;

  • data — входные данные;

  • logs — файлы с логами.

import os

project_name = "мой_проект"
folders = ["src", "data", "logs"]

for folder in folders:
    os.makedirs(os.path.join(project_name, folder), exist_ok=True)

Этот код проходит по списку папок и создаёт их внутри мой_проект. Если папки уже существуют, ошибки не будет.

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

os.makedirs("мой_проект/data/raw", exist_ok=True)

К содержанию

Чтение и запись в файлы: open(), with open as

Скрипт открывает файлы для чтения, добавления или изменения данных. Можно обработать весь текст или отдельные строки. With open автоматически закрывает файл после работы, чтобы избежать ошибок.

Где пригодится

  • Чтение конфигурационных файлов, где хранятся настройки программы.

  • Запись логов о работе приложения.

  • Обновление отчётов и списков.

  • Работа с большими файлами в анализе данных.

Как использовать

Открываем файл и считываем его содержимое.

with open("example.txt", "r") as file:
    content = file.read()
    print(content) 

Открываем файл в режиме w (write), записываем текст. Если файл существует, его содержимое перезапишется.

with open("example.txt", "w") as file:
    file.write("Новый текст в файле")

Если нужно добавить текст, не стирая старый, используем режим a (append).

with open("example.txt", "a") as file:
    file.write("\nДобавленная строка")

Если файл большой, его можно считывать построчно.

with open("example.txt", "r") as file:
    for line in file:
        print(line.strip())  # strip() убирает лишние пробелы и переводы строк

Использование with open as автоматически закрывает файл после работы.

К содержанию

Очистка системы: os, shutil

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

Где пригодится

  • Автоматическая очистка временных файлов перед запуском программы.

  • Удаление старых логов, чтобы не захламлять систему.

  • Освобождение места на диске в фоновом режиме.

Как использовать

Например, можно удалить все файлы из временной папки, а затем очистить корзину. Пример для Windows:

import os
import shutil

# Путь к временной папке
temp_folder = "C:/Users/User/AppData/Local/Temp"

# Удаляем файлы и папки во временной директории
for file in os.listdir(temp_folder):
    file_path = os.path.join(temp_folder, file)
    try:
        if os.path.isfile(file_path):
            os.remove(file_path)
        elif os.path.isdir(file_path):
            shutil.rmtree(file_path)
    except Exception as e:
        print(f"Не удалось удалить {file_path}: {e}")

# Очистка корзины в Windows
os.system("PowerShell.exe -Command Clear-RecycleBin -Force")

Для Linux и macOS:

import os
import shutil

# Путь к временной папке
temp_folder = "/tmp"

# Удаляем файлы и папки во временной директории
for file in os.listdir(temp_folder):
    file_path = os.path.join(temp_folder, file)
    try:
        if os.path.isfile(file_path):
            os.remove(file_path)
        elif os.path.isdir(file_path):
            shutil.rmtree(file_path)
    except Exception as e:
        print(f"Не удалось удалить {file_path}: {e}")

# Очистка корзины
if os.path.exists("~/.local/share/Trash"):  # Для Linux с Gio
    os.system("gio trash --empty")
elif os.path.exists("~/.Trash"):  # Для старых дистрибутивов Linux и macOS
    os.system("rm -rf ~/.Trash/*")

К содержанию

Автофикс ошибок в коде: pylint, autopep8

Автоматически проверяет код и исправляет мелкие ошибки: лишние пробелы, неправильные отступы, несоответствие стилю PEP 8 и т. д.

Где пригодится

  • Поддержание чистоты кода в проектах.

  • Быстрое исправление мелких ошибок перед коммитом.

  • Автоматическая проверка в CI/CD.

Как использовать

Если нужно проверить код вручную, проще использовать командную строку. Для этого запускаем проверку через pylint:

pylint script.py

И автоматическое исправление через autopep8:

autopep8 --in-place --aggressive script.py

Другой вариант — написать скрипт и запускать его перед коммитами или просто время от времени для поддержания порядка в коде.

import os
import autopep8
import pylint.lint
import sys

# Получаем список всех .py-файлов в текущей пape
python_files = [f for f in os.listdir() if f.endswith(".py")]

for file in python_files:
    # Исправляем форматирование
    with open(file, "r") as f:
        formatted_code = autopep8.fix_code(f.read(), options={"aggressive": 1})
    with open(file, "w") as f:
        f.write(formatted_code)
    print(f"Файл {file} отформатирован.")
    
    # Проверяем код с pylint
    try:
        pylint.lint.Run([file], do_exit=False)  # Отключаем аварийное завершение
    except SystemExit as e:
        if e.code != 0:
            print(f"В файле {file} обнаружены ошибки. Код выхода: {e.code}")
        else:
            print(f"Файл {file} успешно прошёл проверку.")

Как использовать этот скрипт:

  1. Сохранить код в файле, например check_code.py.

  2. Запустить команду в терминале:

python check_code.py

Скрипт сам найдёт все .py-файлы в текущей папке, исправит их форматирование и проверит на ошибки.

К содержанию

Более продвинутые скрипты

Автоматическое написание комментариев к коду: docformatter

Исправляет стиль комментариев и документирующих строк в коде. Удаляет лишние пробелы, выравнивает отступы и приводит описания функций к единому формату. 

Где пригодится

  • В больших проектах, где важно единообразие комментариев.

  • При работе в команде, чтобы все использовали один стиль.

  • Для автоматической очистки кода перед публикацией.

Как использовать

Вместо того чтобы запускать docformatter вручную через командную строку, можно написать Python-скрипт, который сам вызовет этот инструмент и приведёт код к нужному стилю.

import subprocess

file_path = "script.py"  # Файл, который нужно обработать

# Автоматически исправляем комментарии
subprocess.run(["docformatter", "--in-place", "--wrap-summaries", "80", "--wrap-descriptions", "80", file_path])

print(f"Файл {file_path} отформатирован.")

К содержанию

Массовая загрузка изображений: requests, concurrent.futures

Скрипт загружает изображения по списку ссылок и делает это параллельно, чтобы ускорить процесс.

Где пригодится

  • Сохранение изображений из базы данных или списка ссылок.

  • Автоматическая выгрузка медиафайлов для проектов.

  • Работа с веб-скрапингом.

Как использовать

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

import requests
import concurrent.futures

# Список изображений для загрузки
image_urls = [
    "https://example.com/image1.jpg",
    "https://example.com/image2.jpg",
    "https://example.com/image3.jpg",
]

def download_image(url):
    response = requests.get(url)
    file_name = url.split("/")[-1]  # Достаём имя файла из ссылки
    with open(file_name, "wb") as file:
        file.write(response.content)
    print(f"Скачан {file_name}")

# Запускаем загрузку изображений параллельно
with concurrent.futures.ThreadPoolExecutor() as executor:
    executor.map(download_image, image_urls)

К содержанию

Работа с данными и отчётами

Базовые скрипты

Парсинг JSON и CSV: json, csv, pandas

Скрипт считывает данные из JSON- и CSV-файлов, чтобы их можно было обработать, преобразовать и использовать дальше.

Где пригодится

  • Получение и обработка данных из API в формате JSON.

  • Загрузка и фильтрация CSV-файлов, например отчётов или списков.

  • Подготовка данных перед сохранением или передачей в базу.

Как использовать

import json
import pandas as pd

# Читаем JSON-файл
with open("data.json", "r") as file:
    data = json.load(file)

# Загружаем CSV в DataFrame и фильтруем строки
df = pd.read_csv("data.csv")
filtered_df = df[df["status"] == "active"]

print(data)
print(filtered_df)

Этот скрипт открывает JSON-файл, загружает из него данные и выводит их на экран. Затем загружает CSV-файл, превращает его в таблицу и оставляет только строки со статусом active. 

К содержанию

Обновление данных в Excel: pandas, openpyxl

Скрипт открывает Excel-файл, обновляет данные и сохраняет изменения.

Где пригодится

  • Автоматическое обновление отчётов.

  • Изменение отдельных ячеек без ручного редактирования.

  • Объединение данных из нескольких файлов в один.

Как использовать

Чтобы pandas мог работать с Excel, нужны дополнительные библиотеки:

  • для .xlsx используется openpyxl;

  • для .xls (старый формат) — xlrd (до версии 2.0).

Эти библиотеки не устанавливаются автоматически, их нужно добавить вручную:

pip install openpyxl xlrd

Если файл в формате .xls, нужно указать engine="xlrd", чтобы pandas смог его прочитать.

Пример кода: 

import pandas as pd
import os

# Открываем Excel-файл
file_path = "report.xlsx"

# Определяем движок в зависимости от формата файла
engine = "xlrd" if file_path.endswith(".xls") else "openpyxl"

try:
    df = pd.read_excel(file_path, engine=engine)

    # Проверяем, есть ли нужные столбцы
    if "Отчёт" in df.columns and "Сумма" in df.columns:
        df.loc[df["Отчёт"] == "Январь", "Сумма"] = 50000

        # Сохраняем файл
        df.to_excel(file_path, index=False, engine="openpyxl")
        print("Файл обновлён.")
    else:
        print("Ошибка: В файле отсутствуют нужные колонки.")

except FileNotFoundError:
    print(f"Ошибка: Файл {file_path} не найден.")
except Exception as e:
    print(f"Ошибка при обработке: {e}")

Этот скрипт открывает Excel, ищет строки с отчётом за январь и обновляет сумму, а затем сохраняет изменения. 

К содержанию

Извлечение текста из PDF: PyMuPDF

Скрипт открывает PDF-документ, считывает текст и сохраняет его в удобном формате.

Где пригодится

  • Извлечение текста из отчётов, инструкций и других документов.

  • Автоматическая обработка PDF без копирования вручную.

  • Преобразование PDF в текст для удобного редактирования.

Как использовать

Этот код проходит по всем страницам PDF, собирает текст и записывает его в .txt:

import fitz  # PyMuPDF

# Открываем PDF-файл
file_path = "document.pdf"
pdf = fitz.open(file_path)

# Считываем текст со всех страниц
text = ""
for page in pdf:
    text += page.get_text() + "\n"

pdf.close()

# Сохраняем результат в текстовый файл
with open("output.txt", "w", encoding="utf-8") as file:
    file.write(text)

print("Текст извлечён и сохранён в output.txt")

К содержанию

Автоматическая отправка отчётов по почте: smtplib

Скрипт формирует письмо и отправляет его через SMTP-сервер.

Где пригодится

  • Отправка ежедневных или недельных отчётов без ручного вмешательства.

  • Уведомление коллег о статусе задач, обновлениях или ошибках в системе.

  • Автоматическая отправка писем после выполнения скрипта или сбора данных.

Как использовать

Этот код подключается к SMTP-серверу, авторизуется и отправляет письмо через STARTTLS (порт 587). 

Если сервер требует SSL, вместо smtplib.SMTP() используйте smtplib.SMTP_SSL() и порт 465.

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# Данные для отправки
smtp_server = "smtp.example.com"  # SMTP-сервер (например, smtp.gmail.com)
smtp_port = 587  # Порт для подключения
sender_email = "your_email@example.com"
password = "your_password"  # Или OAuth 2.0
recipients = ["recipient1@example.com", "recipient2@example.com"]  # Список получателей

# Создаём письмо
msg = MIMEMultipart()
msg["From"] = sender_email
msg["Subject"] = "Автоматический отчёт"

# Текст письма
body = "Добрый день, прикрепляю свежий отчёт."
msg.attach(MIMEText(body, "plain"))

# Подключаемся к серверу и отправляем письма
try:
    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.starttls()  # Начинаем защищённое соединение
        server.login(sender_email, password)  # Авторизация на сервере

        for recipient in recipients:
            try:
                # Устанавливаем поле "To" для каждого получателя
                msg.replace_header("To", recipient)
                
                # Отправляем письмо конкретному получателю
                server.sendmail(sender_email, recipient, msg.as_string())
                print(f"Письмо успешно отправлено: {recipient}")
            except smtplib.SMTPRecipientsRefused as e:
                print(f"Ошибка: Получатель недоступен ({recipient}): {e}")
            except smtplib.SMTPException as e:
                print(f"Ошибка при отправке письма ({recipient}): {e}")
except smtplib.SMTPAuthenticationError:
    print("Ошибка: Неправильный логин или пароль. Проверьте настройки почты.")
except smtplib.SMTPException as e:
    print(f"Ошибка при подключении к SMTP-серверу: {e}")

Некоторые почтовые сервисы, такие как Gmail и Outlook, требуют безопасной авторизации. Вместо обычного пароля может понадобиться OAuth 2.0 или пароль приложения. В Gmail такой пароль можно создать в настройках безопасности, В Gmail его можно создать в настройках безопасности конкретного аккаунта, а в Outlook — в учетной записи Microsoft.

Если почтовый клиент не поддерживает OAuth 2.0, используйте пароль приложения.

К содержанию

Проверка формата JSON-файлов: json

Скрипт загружает JSON-файл и проверяет, соответствует ли он правильному формату. 

Где пригодится

  • Проверка данных перед загрузкой в базу или отправкой на сервер.

  • Валидация JSON-ответов от API, чтобы избежать ошибок в коде.

  • Автоматическая проверка конфигурационных файлов перед их использованием.

Как использовать

Этот код пытается загрузить JSON-файл, а если формат неверный, выводит сообщение об ошибке:

import json
import os

file_path = "data.json"

try:
    if not os.path.exists(file_path):
        raise FileNotFoundError("Файл не найден.")

    with open(file_path, "r") as file:
        content = file.read().strip()
        if not content:
            raise ValueError("Файл пуст.")

        data = json.loads(content)

    print("Файл корректен.")
except FileNotFoundError:
    print("Ошибка: Файл не найден.")
except ValueError as e:
    print(f"Ошибка: {e}")
except json.JSONDecodeError as e:
    print(f"Ошибка в JSON: {e}")

К содержанию

Более продвинутые скрипты

Парсинг веб-страниц для сбора данных: requests, BeautifulSoup

Скрипт загружает страницу из интернета и извлекает нужную информацию. Requests получает содержимое сайта, а BeautifulSoup помогает найти и обработать нужную информацию.

Где пригодится

  • Автоматический сбор цен, курсов валют или новостей.

  • Извлечение информации из интернет-магазинов, например описаний и отзывов.

  • Анализ контента, если нужно отслеживать изменения на страницах.

Как использовать

Скрипт загружает HTML-код страницы, находит заголовки <h2> и выводит их:

import requests
from bs4 import BeautifulSoup

# Загружаем страницу
url = "https://example.com"
# Добавляем проверку статуса ответа
response = requests.get(url)
if response.status_code != 200:
    print(f"Не удалось загрузить страницу. Код ошибки: {response.status_code}")
    exit()

html = response.text

# Извлекаем данные
soup = BeautifulSoup(html, "html.parser")
titles = soup.find_all("h2")

for title in titles:
    print(title.text)

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

К содержанию

Генерация SQL-запросов по шаблонам: jinja2

Скрипт подставляет данные в шаблон и создаёт SQL-запрос. Это помогает менять условия без переписывания кода.

Где пригодится

  • Генерация запросов, которые меняются в зависимости от входных данных.

  • Фильтрация данных без написания новых SQL-инструкций.

  • Автоматическое формирование отчётов.

Как использовать

Шаблон SQL содержит переменные, которые заменяются на нужные значения. Код автоматически подставляет параметры и формирует готовый запрос:

from jinja2 import Template

sql_template = """
SELECT * FROM users
WHERE age > {{ min_age }}
{% if city is not none %}
AND city = '{{ city | replace("'", "''") }}'
{% endif %}
"""

template = Template(sql_template)

# Пример: если city=None, условие AND city = ... не добавится
query = template.render(min_age=25, city="Москва")

print(query)

К содержанию

Мониторинг изменений в данных: difflib

Скрипт сравнивает две версии текста или файлов и находит различия.

Где пригодится

  • Проверка, что в файле или отчёте появились новые строки.

  • Поиск изменений в JSON-ответах API.

  • Отслеживание корректировок в документах или коде.

Как использовать

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

import difflib

old_data = """Имя: Иван
Возраст: 25
Город: Москва"""

new_data = """Имя: Иван
Возраст: 26
Город: Санкт-Петербург"""

# Разница между текстами
diff = difflib.unified_diff(old_data.splitlines(), new_data.splitlines(), lineterm="")

print("\n".join(diff))

К содержанию

Автоматизация тестирования

Базовые скрипты

Запуск тестов на Python: pytest

Скрипт проверяет, правильно ли работает код.

Где пригодится

  • Проверка кода перед обновлениями.

  • Автоматический поиск ошибок в функциях и расчётах.

  • Тестирование без ручного запуска программы.

Как использовать

Сначала пишем тест: указываем, какой результат ожидаем от функции.

# test_example.py
def add(a, b):
    return a + b

def test_add():
    assert add(2, 3) == 5  # Проверяем, что функция работает правильно

Затем запускаем тест в консоли:

pytest test_example.py

Если код работает без ошибок, тест пройдёт. Если что-то не так, pytest покажет, где проблема.

К содержанию

Генерация тестовых данных: faker

Скрипт создаёт случайные имена, адреса, номера телефонов и другие данные.

Где пригодится

  • Заполнение форм и баз данных тестовыми значениями.

  • Проверка того, как программа работает с разными входными данными.

Как использовать

from faker import Faker

fake = Faker()

print(fake.name())       # Случайное имя
print(fake.address())    # Адрес
print(fake.email())      # Электронная почта

К содержанию

Тестирование API: requests, pytest

Скрипт проверяет, что API работает и возвращает нужные данные. 

Где пригодится

  • Автоматическое тестирование перед обновлениями.

  • Поиск ошибок в запросах к API и их ответах при интеграции с другими сервисами.

  • Контроль стабильности API с помощью автоматических проверок.

Как использовать

Скрипт отправляет GET-запрос и проверяет, что ответ содержит код 200 и нужные данные. Если API работает неправильно, тест покажет, в чём ошибка:

import requests

def test_api():
    response = requests.get("https://jsonplaceholder.typicode.com/posts/1")
    assert response.status_code == 200  # Проверяем, что запрос успешный
    assert "userId" in response.json()  # Проверяем, что в ответе есть нужные данные

Чтобы проверить API автоматически, код нужно сохранить в файле test_example.py, а затем выполнить команду:

pytest test_example.py

К содержанию

Более продвинутые скрипты

Нагрузочное тестирование API: locust

Скрипт проверяет, как API работает под нагрузкой, когда приходит много запросов.

Где пригодится

  • Проверка, выдержит ли API большое число пользователей.

  • Измерение скорости работы сервиса под нагрузкой.

  • Поиск узких мест, где система начинает работать медленнее.

Как использовать

Сначала устанавливаем Locust:

pip install locust

Затем создаём файл locustfile.py и описываем тест:

from locust import HttpUser, task, between

class WebsiteUser(HttpUser):
    host = "http://example.com"  # Указываем адрес API
    wait_time = between(1, 3)  # Пауза между запросами

    @task
    def get_posts(self):
        self.client.get("/posts")

Запускаем тест командой:

locust -f locustfile.py

Открываем веб-интерфейс Locust в браузере по адресу http://localhost:8089, где можно задать количество пользователей и частоту запросов.

Чем скрипт лучше альтернативных

  • Проще, чем JMeter: не требует сложной настройки.

  • Гибче, чем ApacheBench (ab): можно задавать сценарии поведения пользователей.

  • Имеет удобный интерфейс: результаты тестов видно прямо в браузере.

К содержанию

Генерация тестов по коду: mutmut

Скрипт вносит случайные изменения в код и проверяет, заметят ли их тесты. 

Где пригодится

  • Оценка качества тестов.

  • Автоматический поиск слабых мест в коде.

  • Улучшение покрытия без ручного написания тестов.

Как использовать

Сначала устанавливаем mutmut:

pip install mutmut

Затем запускаем проверку:

mutmut run

Если тесты нашли ошибку, значит, код хорошо покрыт тестами. Если нет — проверок не хватает и их нужно доработать.

К содержанию

Автоматизированный логин и заполнение сложных форм в браузере: Selenium

Скрипт открывает браузер, вводит логин и пароль, заполняет формы и нажимает кнопки.

Где пригодится

  • Тестирование логина и форм в веб-приложениях.

  • Автоматическое заполнение заявок и заказов.

  • Вход в админ-панели и закрытые системы без API.

  • Массовый ввод данных в веб-интерфейсы.

  • Автоматическая отправка отчётов через браузер.

Как использовать

Сначала устанавливаем Selenium:

pip install selenium

Затем пишем скрипт:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

# Открываем браузер
driver = webdriver.Chrome()
driver.get("https://example.com/login")

# Находим поля и вводим данные
driver.find_element(By.NAME, "username").send_keys("my_username")
driver.find_element(By.NAME, "password").send_keys("my_password", Keys.RETURN)

print("Логин выполнен")

Скрипт открывает страницу, вводит логин и пароль, затем нажимает Enter.

К содержанию

Автоматический мониторинг логов с уведомлениями: watchdog, Telegram API

Скрипт следит за изменениями в логах и отправляет уведомления при появлении ошибок. 

Где пригодится

  • Контроль логов серверов и приложений.

  • Отслеживание ошибок и критических событий.

  • Оповещение команды о сбоях в реальном времени.

Как использовать

Сначала устанавливаем watchdog для слежения за файлами:

pip install watchdog telebot

Затем создаём скрипт, который следит за логами и отправляет уведомления в Telegram:

import time
import os
import telebot
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

# Настраиваем Telegram-бота
TELEGRAM_BOT_TOKEN = "your_telegram_bot_token"
CHAT_ID = "your_chat_id"
bot = telebot.TeleBot(TELEGRAM_BOT_TOKEN)

# Файл логов
LOG_FILE_PATH = "server.log"

class LogMonitorHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if os.path.basename(event.src_path) == os.path.basename(LOG_FILE_PATH):
            with open(LOG_FILE_PATH, "r") as file:
                file.seek(0, os.SEEK_END)  # Перемещаемся в конец файла
                last_line = file.readline().strip()  # Читаем последнюю строку
                
                # Если в последней строке есть ERROR, отправляем уведомление
                if "ERROR" in last_line:
                    try:
                        bot.send_message(CHAT_ID, f"Обнаружена ошибка в логе:\n{last_line}")
                    except Exception as e:
                        print(f"Ошибка при отправке сообщения в Telegram: {e}")

# Запускаем слежение за логами
observer = Observer()
event_handler = LogMonitorHandler()
observer.schedule(event_handler, path=".", recursive=False)
observer.start()

try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    observer.stop()
observer.join()

Как это работает:

  1. Скрипт следит за файлом server.log: если он изменился, скрипт проверяет последнюю строку.

  2. Если в логе появляется ошибка (ERROR), бот отправляет уведомление в Telegram.

  3. Скрипт работает в фоне, пока его не остановят (Ctrl + C).

К содержанию

Автоматизация DevOps и CI/CD

Базовые скрипты

Автоформатирование кода: black, isort

Скрипт исправляет стиль кода: black приводит его к единым правилам, а isort сортирует импорты.

Где пригодится

  • Приведение кода к единому стилю без ручных исправлений.

  • Упрощение работы в команде, где важно следовать общим стандартам.

  • Автоматическое исправление перед коммитом.

Как использовать

Устанавливаем black и isort:

pip install black isort

Запускаем автоформатирование:

black my_script.py
isort my_script.py

К содержанию

Работа с pre-commit-хуками: pre-commit

Скрипт автоматизирует проверку и форматирование кода перед коммитом.

Вместо ручного запуска black и isort, pre-commit сам активирует эти инструменты (и другие, если нужно) перед каждым коммитом.

Как использовать

Устанавливаем pre-commit:

pip install pre-commit

Создаём конфигурационный файл .pre-commit-config.yaml:

repos:
  - repo: https://github.com/psf/black
    rev: 23.9.1
    hooks:
      - id: black

  - repo: https://github.com/PyCQA/isort
    rev: 5.12.0
    hooks:
      - id: isort

Устанавливаем pre-commit-хуки в репозитории:

pre-commit install

Теперь при каждом коммите pre-commit автоматически запускает black и isort:

git commit -m "Добавлена новая функциональность"

Pre-commit не ограничивается только black и isort: он может автоматически запускать любые проверки, которые нужны в проекте. 

К содержанию

Автообновление зависимостей: pip list --outdated

Скрипт проверяет, какие библиотеки устарели, и помогает обновить их до актуальных версий. 

Где пригодится

  • Актуализация зависимостей в проекте.

  • Устранение уязвимостей в старых версиях пакетов.

  • Снижение риска несовместимости кода с последними обновлениями библиотек.

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

Почему это важно:

  • массовое обновление может вызвать конфликты между библиотеками;

  • новая версия пакета может изменить API и сломать код;

  • некоторые библиотеки зависят от старых версий других пакетов и их обновление приведёт к ошибкам.

Как использовать

Проверяем, какие пакеты устарели:

pip list --outdated

Обновляем конкретную библиотеку:

pip install --upgrade package_name

Проверяем, что код работает после обновления: запускаем тесты и проверяем логи.

К содержанию

Отправка персонализированных писем нескольким получателям: smtplib

Скрипт отправляет письма сразу нескольким людям, подставляя индивидуальные данные (например, имя или отчёт). Это удобно для автоматических рассылок, уведомлений и деловой переписки.

Где пригодится

  • Массовая рассылка писем с индивидуальным текстом (например, обращения по имени).

  • Автоматическое уведомление сотрудников или клиентов (отчёты, напоминания).

Как использовать

Устанавливать ничего не нужно, smtplib входит в стандартную библиотеку Python. Настраиваем SMTP-сервер (например, Яндекс):

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# Данные для входа в почту
smtp_server = "smtp.yandex.ru"
smtp_port = 587
email_address = "your_email@yandex.ru"
email_password = "your_yandex_password"

# Список получателей
recipients = ["recipient1@example.com", "recipient2@example.com"]

# Подготовка письма
subject = "Персонализированное письмо"
body_template = "Здравствуйте, {name}! Это ваш отчёт за месяц."

# Подключаемся к SMTP-серверу
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()  # Защищённое соединение
server.login(email_address, email_password)

# Отправляем письма каждому получателю
for recipient in recipients:
    msg = MIMEMultipart()
    msg['From'] = email_address
    msg['To'] = recipient
    msg['Subject'] = subject
    
    # Персонализируем текст письма
    name = recipient.split("@")[0]  # Например, берём имя из email
    body = body_template.format(name=name)
    msg.attach(MIMEText(body, 'plain'))
    
    server.sendmail(email_address, recipient, msg.as_string())

# Закрываем соединение
server.quit()

Если у вас включена двухфакторная аутентификация, обычный пароль не подойдёт. Нужно создать пароль приложения в настройках Яндекса.

К содержанию

Более продвинутые скрипты

Мониторинг загрузки CPU/RAM: psutil

Скрипт проверяет загрузку процессора и оперативной памяти. 

Где пригодится

  • Отслеживание нагрузки на сервер в реальном времени.

  • Автоматический сбор метрик для анализа производительности.

  • Контроль потребления ресурсов при работе программ.

Как использовать

Сначала установим psutil:

pip install psutil

Затем напишем скрипт для мониторинга:

import psutil

# Получаем загрузку процессора (%)
cpu_usage = psutil.cpu_percent(interval=1)
print(f"Загрузка CPU: {cpu_usage}%")

# Получаем использование оперативной памяти
memory_info = psutil.virtual_memory()
print(f"Использование RAM: {memory_info.percent}%")

Этот код измеряет текущую загрузку CPU и оперативной памяти и выводит результаты. Можно запустить его в цикле, чтобы следить за ресурсами в реальном времени.

К содержанию

Мониторинг сайтов и API: requests, ping3

Этот скрипт проверяет, доступен ли сайт или API, отправляя запрос. Если ресурс недоступен, можно сразу узнать о проблеме.

Где пригодится

  • Автоматический контроль доступности сайтов.

  • Проверка работы API без ручного тестирования.

  • Мониторинг серверов, чтобы оперативно реагировать на сбои.

Как использовать

Устанавливаем библиотеки:

pip install requests ping3

Запускаем скрипт для проверки сайта и API:

import requests
from ping3 import ping

# Проверяем доступность сайта через HTTP-запрос
def check_website(url):
    try:
        response = requests.get(url, timeout=5)
        if response.status_code == 200:
            print(f"Сайт {url} доступен.")
        else:
            print(f"Сайт {url} вернул ошибку: {response.status_code}")
    except requests.exceptions.RequestException:
        print(f"Ошибка подключения к {url}")

# Проверяем доступность сервера по IP (ping)
def check_ping(host):
    response = ping(host)
    if response:
        print(f"{host} доступен, время отклика: {response * 1000:.2f} ms")
    else:
        print(f"{host} не отвечает")

# Пример использования
check_website("https://example.com")
check_ping("8.8.8.8")  # Пинг до Google DNS

К содержанию

Правила хорошего кода для автоматизации 

Автоматизация должна экономить время, а не усложнять жизнь. Чем удобнее код, тем меньше времени тратится на его поддержку и доработку. 

Следуйте этим простым правилам, чтобы писать удобные и надёжные скрипты. 

1. Минимизируйте ручной ввод

Чем меньше данных нужно вводить вручную, тем лучше.

Плохо: запрашивать ввод параметров каждый раз при запуске.

Хорошо: сохранять настройки в файле конфигурации или использовать аргументы командной строки.

2. Логируйте ошибки, а не просто печатайте их в консоль

Если скрипт падает с ошибкой, важно понимать, что пошло не так.

Плохо:

print("Ошибка при выполнении")

Хорошо:

import logging

logging.basicConfig(filename="error.log", level=logging.ERROR)
logging.error("Ошибка при выполнении", exc_info=True)

Так ошибка останется в файле, даже если консоль закроется.

3. Сохраняйте код гибким и расширяемым

Скрипт не должен работать только в одном случае — лучше сделать его универсальным. Если код легко изменить под новую задачу, он прослужит дольше и не придётся всё писать заново.

Плохо:

file_path = "C:/Users/Username/Documents/report.csv"

Хорошо:

import os

file_path = os.path.join(os.getenv("USERPROFILE"), "Documents", "report.csv")

Теперь путь будет работать и на других компьютерах.

4. Уменьшайте количество зависимостей

Чем больше библиотек использует скрипт, тем выше вероятность конфликтов и сложностей при установке.

Плохо: использовать тяжёлые библиотеки там, где можно обойтись стандартными инструментами.
Хорошо: сначала пробовать встроенные модули (os, json, csv), а дополнительные (pandas, requests) подключать только при необходимости.

5. Используйте автоформатирование кода

Инструменты вроде black и isort помогают автоматически исправлять стиль кода. Установите pre-commit, чтобы всегда проверять код перед коммитом.

6. Следите за безопасностью

Не храните пароли и ключи в коде. Используйте переменные окружения или файлы конфигурации.

Плохо:

password = "mypassword123"

Хорошо:

import os

password = os.getenv("EMAIL_PASSWORD")

А пароль храните в .env-файле или настройках системы.

7. Оставляйте понятные комментарии

Код, который понятен вам сегодня, через месяц может вызвать вопросы. Не ленитесь дописывать уточнения.

Плохо:

# Обработать файл
process(file)

Хорошо:

# Преобразуем входной CSV-файл в JSON
processed_data = convert_csv_to_json(file)

Автоматизация — это не только про экономию времени, но и про заботу о себе. Хороший код упрощает работу, а вам остаётся больше сил на то, что действительно интересно. Не бойтесь экспериментировать и искать свои удобные решения — именно в этом и кроется вся магия Python. 

Прикоснуться к магии Python можно, начав с бесплатных занятий. А стать востребованным питонистом и открыть бóльшие перспективы в карьере позволит обучение с программой трудоустройства: «Python-разработчик с нуля», «Python-разработчик: расширенный курс» или «Fullstack-разработчик на Python». С промокодом DSHABR10 цена ещё приятнее.

Комментарии (1)


  1. memclutter
    20.02.2025 10:13

    # Преобразуем входной CSV-файл в JSON
    processed_data = convert_csv_to_json(file)

    По идее, комментарий в таком виде тоже не очень: имя функции convert_csv_to_json говорящее и комментарий дублирует информацию, а имя переменной file можно назвать input_csv_file.

    Куда полезней было написать какие то нюансы которые в коде не выразить, например "При преобразовании будут отфильтрованные мусорные строки" или "После преобразования получим объект вида... ссылка на описание структуры объекта json"

    Но это скорее вкусовщина наверное, в целом то материал полезный, спасибо