Skip to content

Практическая работа №8

Основные теоретические положения

Section titled “Основные теоретические положения”

1. Импорт модулей

import statistics
from datetime import datetime
from pathlib import Path
values = [20, 30, 40]
print(statistics.mean(values))
print(datetime.now().strftime("%d.%m.%Y %H:%M"))
print(Path("report.txt").suffix)

import module подключает модуль; from module import name — отдельный объект. Не рекомендуется использовать from module import *.


2. Собственный модуль

Файл analysis_utils.py:

def count_above(values, limit):
return sum(1 for value in values if value > limit)

Файл main.py:

from analysis_utils import count_above
print(count_above([12, 35, 48], 30))

Вспомогательный модуль не должен запускать обработку файла автоматически при импорте.


3. pathlib: расположение и чтение файлов

from pathlib import Path
path = Path("data.txt")
if path.exists():
text = path.read_text(encoding="utf-8")
print(path.name, path.suffix, len(text))

Для поиска файлов: Path("logs").glob("*.log"). Для обхода вложенных каталогов: rglob("*"), проверяя path.is_file().


4. csv: чтение данных с разделителем

В файлах CSV данного занятия разделитель ;, а первая строка — заголовки столбцов.

import csv
with open("data.csv", "r", encoding="utf-8", newline="") as file:
reader = csv.DictReader(file, delimiter=";")
for row in reader:
print(row)

DictReader связывает имена полей заголовка со значениями каждой строки. Все значения первоначально являются строками и требуют проверки/преобразования.


5. statistics и math

import math
import statistics
values = [10, 20, 30, 40]
print(statistics.mean(values))
print(statistics.median(values))
print(math.ceil(2500 / 1024))

Если числовых значений нет, statistics.mean() и median() не вызывайте: сначала проверьте пустой набор.


6. collections.Counter

from collections import Counter
levels = ["INFO", "ERROR", "INFO", "WARNING", "ERROR"]
counts = Counter(levels)
print(counts["ERROR"])
print(counts.most_common())

Counter удобно использовать для подсчёта частот повторяющихся значений.


7. json: сохранение структурированного результата

import json
from pathlib import Path
result = {"checked": 8, "errors": 2}
Path("report.json").write_text(
json.dumps(result, ensure_ascii=False, indent=2),
encoding="utf-8"
)

Формат JSON подходит для передачи результатов другой программе. Числа сохраняйте числами, а не строками.


8. datetime: работа с датами

from datetime import datetime
when = datetime.strptime("2026-10-01 09:15", "%Y-%m-%d %H:%M")
print(when.strftime("%d.%m.%Y %H:%M"))

Для текущего времени отчёта используйте datetime.now(); дата в имени файла не обязательна.


9. ipaddress: проверка сетевых адресов

from ipaddress import ip_address, ip_network
address = ip_address("192.168.1.10")
network = ip_network("192.168.1.0/24")
print(address in network)

Если адрес некорректен, модуль генерирует ValueError: обработайте ошибку, не останавливая всю программу.

Задания для выполнения

Section titled “Задания для выполнения”

Часть 1. Исследование модулей

Выполните задания 1.1–1.4 до перехода к своему варианту. В этой части используйте небольшую учебную папку, а в индивидуальном варианте создайте собственный проект.


Задание 1.1. Подключение стандартной библиотеки

Подключите statistics и datetime. Для значений [30, 70, 90, 90, 20] вычислите среднее, медиану и выведите текущее время в формате ДД.ММ.ГГГГ ЧЧ:ММ.

Объясните различие между import statistics и from statistics import mean.


Задание 1.2. Разделение программы на два модуля

Создайте utils.py с функцией count_high(values, limit), которая возвращает число значений не ниже порога. В main.py импортируйте функцию и проверьте её на нескольких списках.

Убедитесь, что импорт utils не запускает программу автоматически.


Задание 1.3. Чтение CSV через стандартную библиотеку

Для файла, содержащего заголовок host;cpu и строки srv01;85, srv02;40, srv03;93, напишите чтение с csv.DictReader(..., delimiter=";"). Получите список чисел и рассчитайте среднее через statistics.

Поясните, почему значения из CSV нужно преобразовывать в int.


Задание 1.4. Формирование JSON-отчёта

Сформируйте словарь с количеством записей, средним значением и датой проверки. Запишите его в report.json через json.dump() или json.dumps() с ensure_ascii=False. Откройте полученный файл и объясните разницу между числовыми и строковыми значениями JSON.


Часть 2. Комплексное индивидуальное задание

Section titled “Часть 2. Комплексное индивидуальное задание”

Вариант 1. Анализ загрузки CPU

Задача: разработать утилиту «анализ загрузки cpu». Рекомендуемые стандартные модули: csv, statistics, datetime, json, pathlib (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Прочитайте cpu.csv через csv.DictReader, проверьте целые значения 0–100 и непустые имена узлов. Неисправные записи пропускайте.
  2. В собственном модуле реализуйте функции parse_cpu(), get_statistics() и get_critical(); их интерфейсы и возвращаемые типы определите самостоятельно.
  3. Через statistics найдите среднюю загрузку, медиану и максимум по всем корректным измерениям.
  4. Сформируйте список уникальных имён узлов, у которых хотя бы одно измерение ≥ 85, сортируя по максимальной нагрузке (при равенстве — по имени).
  5. Создайте report.json с полями generated_at, total, invalid, mean, median, max, critical_hosts.
  6. Проверьте порог 85, пустой CSV и нечисловое значение. Обработайте отсутствие измерений.
  7. Дополнительно сформируйте by_host: для каждого имени узла рассчитайте число измерений и максимальную загрузку; не создавайте по одному объекту на каждое повторное измерение.

Исходные данные:

📄 Содержимое файла cpu.csv — раскрыть и скопировать
cpu.csv
host;cpu
srv01;45
srv02;89
db01;92
srv01;64
srv02;85
pc01;30
srv03;101
srv04;abc
backup01;78
srv05;0
srv06;95

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 2. Учёт ошибок авторизации

Задача: разработать утилиту «учёт ошибок авторизации». Рекомендуемые стандартные модули: csv, collections.Counter, ipaddress, json, datetime (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Прочитайте файл через csv.DictReader, проверьте наличие полей, допустимость результата SUCCESS/FAILED и корректность IP с ipaddress.ip_address().
  2. В utils.py реализуйте функции проверки записи, выбора отказов и формирования частот по IP.
  3. При помощи Counter найдите количество отказов на каждый IP и число уникальных источников ошибок.
  4. Отберите IP с ≥ 2 отказами и отсортируйте по убыванию частоты, затем по IP-адресу как строке.
  5. Сохраните report.json: generated_at, valid, invalid, failed, suspicious (список объектов ip, count).
  6. Проверьте недопустимый IP, неизвестный результат, файл без неудачных входов.
  7. Дополнительно вычислите failed_by_user: число отказов для каждого пользователя; отсортируйте пользователей в отчёте по количеству отказов.

Исходные данные:

📄 Содержимое файла auth.csv — раскрыть и скопировать
auth.csv
ip;user;result
192.168.1.10;admin;FAILED
192.168.1.20;student;SUCCESS
192.168.1.10;admin;FAILED
192.168.1.15;guest;FAILED
192.168.1.20;student;FAILED
192.168.1.10;admin;FAILED
192.168.1.30;operator;SUCCESS
192.168.1.40;root;UNKNOWN
;student;FAILED
192.168.1.15;guest;FAILED

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 3. Проверка адресного плана

Задача: разработать утилиту «проверка адресного плана». Рекомендуемые стандартные модули: csv, ipaddress, collections.Counter, json, datetime (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Прочитайте hosts.csv и проверьте корректность адресов через ipaddress.ip_address; допустимы только IPv4 и непустые имена.
  2. В собственном модуле реализуйте проверку IP, поиск адресов в подсети и подсчёт узлов по группам.
  3. Для каждого адреса определите принадлежность сети 192.168.1.0/24; посчитайте внутри и вне подсети.
  4. Найдите повторяющиеся IPv4-адреса у разных узлов и сгруппируйте устройства по group.
  5. Создайте JSON-отчёт с inside_subnet, outside_subnet, duplicates, by_group, invalid и датой.
  6. Проверьте неверный IP, адрес сети 192.168.2.50 и дублирование адреса.
  7. Дополнительно сформируйте by_group: количество устройств в каждой группе внутри и вне целевой подсети; пустое поле group считайте ошибкой.

Исходные данные:

📄 Содержимое файла hosts.csv — раскрыть и скопировать
hosts.csv
host;ip;group
srv01;192.168.1.10;servers
srv02;192.168.1.11;servers
pc01;192.168.1.101;users
router01;192.168.1.1;network
srv03;10.0.0.5;servers
pc02;192.168.1.102;users
printer01;192.168.2.50;peripheral
unknown;not_ip;users
backup01;192.168.1.20;servers
srv04;192.168.1.11;servers

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 4. Анализ каталога журналов

Задача: разработать утилиту «анализ каталога журналов». Рекомендуемые стандартные модули: pathlib, collections.Counter, json, datetime (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Через Path("logs").glob("*.log") найдите все файлы .log; отсутствие каталога отобразите понятным сообщением.
  2. В собственном модуле реализуйте функции получения числа строк, определения уровня записи и формирования сводки.
  3. Для каждого файла подсчитайте общий объём в байтах и количество непустых строк.
  4. Посчитайте строки, содержащие ERROR или LOGIN_FAILED; сгруппируйте результаты по именам файлов.
  5. Сохраните report.json с files, total_bytes, total_lines, problem_lines, generated_at.
  6. Проверьте добавление нового журнала, пустой файл и отсутствие каталога logs.
  7. Добавьте most_problematic: имя файла с максимальным количеством проблемных строк. При равенстве выбирайте лексикографически первое имя; при отсутствии файлов используйте null.

Исходные данные:

Структура проекта для варианта 4:

  • Directorypractice_08/
    • main.py
    • utils.py
    • Directorylogs
      • app.log
      • auth.log
      • system.log
    • report.json — формируется программой
📄 Содержимое файла logs/app.log — раскрыть и скопировать
logs/app.log
INFO started
ERROR connection lost
WARNING slow query
📄 Содержимое файла logs/auth.log — раскрыть и скопировать
logs/auth.log
LOGIN_SUCCESS admin
LOGIN_FAILED student
LOGIN_FAILED guest
📄 Содержимое файла logs/system.log — раскрыть и скопировать
logs/system.log
INFO boot
ERROR disk full

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 5. Контроль состояния служб

Задача: разработать утилиту «контроль состояния служб». Рекомендуемые стандартные модули: csv, collections.Counter, json, datetime (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Проверьте поля host, service, status (active/inactive) и отбракуйте некорректные строки.
  2. В отдельном модуле реализуйте parse_service(), подсчёт по статусам и выбор служб с неполадками.
  3. Через Counter подсчитайте состояния по всем службам и для каждого узла.
  4. Получите список узлов с минимум одной неактивной службой, сортируя по числу неактивных служб.
  5. Запишите report.json с status_counts, hosts_with_problems, valid, invalid, датой.
  6. Проверьте неизвестное состояние, пустое имя службы и файл, где все службы active.
  7. Добавьте by_host: количество active и inactive по каждому устройству. В hosts_with_problems выводите узлы с точным числом неисправных служб.

Исходные данные:

📄 Содержимое файла services.csv — раскрыть и скопировать
services.csv
host;service;status
srv01;ssh;active
srv01;nginx;inactive
srv01;cron;active
srv02;ssh;active
srv02;nginx;inactive
db01;postgresql;active
db01;backup;inactive
srv03;docker;active
srv04;nginx;broken
srv05;;active
backup01;ssh;inactive

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 6. Измерения времени ответа

Задача: разработать утилиту «измерения времени ответа». Рекомендуемые стандартные модули: csv, statistics, math, json, datetime (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Прочитайте CSV и проверьте: -1 — недоступность, 0–500 — допустимое время в мс; остальные значения ошибочны.
  2. В собственном модуле реализуйте проверку измерения, статистику успешных ответов и выбор медленных узлов.
  3. Через statistics найдите среднее и медиану успешных ответов, через math.ceil округлите среднее вверх.
  4. Выделите значения > 80 мс, отсортируйте по убыванию задержки, рассчитайте процент недоступных.
  5. Создайте report.json: online, offline, invalid, mean_ms, median_ms, slow_hosts, generated_at.
  6. Проверьте только недоступные узлы, значение ровно 80 и нечисловой ввод.
  7. Добавьте slow_by_host: количество измерений выше 80 мс для каждого узла. Обработайте повторные измерения одного и того же узла.

Исходные данные:

📄 Содержимое файла ping.csv — раскрыть и скопировать
ping.csv
host;latency_ms
srv01;15
srv02;-1
router01;21
srv03;109
srv04;87
backup01;35
printer01;-1
db01;58
srv05;abc
srv06;0
srv07;105
srv08;999

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 7. Температурный мониторинг

Задача: разработать утилиту «температурный мониторинг». Рекомендуемые стандартные модули: csv, statistics, collections.Counter, json, datetime (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Проверьте целые значения температуры в диапазоне 0–120 °C и непустые имена узлов.
  2. В собственном модуле создайте функции чтения/проверки, вычисления статистики и определения состояния.
  3. Рассчитайте среднее, медиану и максимальную температуру по валидным значениям.
  4. Присвойте категории: normal < 70, warning 70–79, critical ≥ 80; получите частоты категорий.
  5. Создайте JSON-отчёт с частотами, mean, median, max, списком критических узлов и датой.
  6. Проверьте температуру 70/80/120, файл из одних ошибок, отсутствие критических значений.
  7. Добавьте per_host: для каждого корректного измерения сохраняйте имя, значение и категорию; отсортируйте список по температуре по убыванию.

Исходные данные:

📄 Содержимое файла sensors.csv — раскрыть и скопировать
sensors.csv
host;temperature_c
srv01;42
srv02;75
db01;88
router01;55
srv03;91
srv04;80
printer01;38
srv05;121
srv06;error
backup01;66
db02;87
srv07;0

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 8. Проверка JSON-конфигурации

Задача: разработать утилиту «проверка json-конфигурации». Рекомендуемые стандартные модули: json, ipaddress, pathlib, datetime (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Прочитайте файл settings.json с помощью json.loads() или json.load(); отдельно обработайте отсутствующий файл и синтаксическую ошибку JSON.
  2. В собственном модуле реализуйте функции проверки обязательных ключей, числовых границ и IP-параметров.
  3. Проверьте, что server — IPv4, port 1–65535, timeout 1–300, retries 0–10, debug — логическое значение.
  4. Проверьте через ipaddress.ip_network(), что адрес сервера входит в allowed_network.
  5. Сформируйте report.json: valid_config, errors, server_in_allowed_network, generated_at.
  6. Проверьте отсутствующий port, строковое значение порта и недопустимую маску подсети.
  7. Добавьте checked_fields: перечень проверенных параметров с признаком успеха/ошибки; не прекращайте проверку после первой ошибки, если JSON синтаксически корректен.

Исходные данные:

📄 Содержимое файла settings.json — раскрыть и скопировать
settings.json
{
"server": "192.168.1.10",
"port": 8080,
"timeout": 30,
"retries": 5,
"debug": false,
"allowed_network": "192.168.1.0/24"
}

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 9. Состояния сетевых интерфейсов

Задача: разработать утилиту «состояния сетевых интерфейсов». Рекомендуемые стандартные модули: csv, ipaddress, collections.Counter, json, datetime (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Проверьте четыре поля, допустимость IP по ipaddress и значения статуса up/down.
  2. В собственном модуле реализуйте разбор записи, статистику интерфейсов по состоянию и анализ по устройствам.
  3. Подсчитайте число up/down и количество устройств с хотя бы одним down.
  4. Определите, сколько корректных интерфейсов принадлежит сети 192.168.1.0/24.
  5. Запишите JSON-отчёт: statuses, in_subnet, devices_with_down, invalid, дату.
  6. Проверьте неверный IP, неизвестный статус и граничный адрес сети.
  7. Добавьте by_device: для каждого устройства число исправных и отключённых интерфейсов. Не дублируйте имена в devices_with_down.

Исходные данные:

📄 Содержимое файла interfaces.csv — раскрыть и скопировать
interfaces.csv
device;interface;ip;status
srv01;eth0;192.168.1.10;up
srv01;eth1;10.0.0.10;down
router01;wan0;203.0.113.2;up
srv02;eth0;192.168.1.11;up
printer01;wlan0;192.168.1.50;down
db01;ens18;192.168.1.20;up
srv03;eth0;wrong-ip;up
srv04;eth0;192.168.1.12;unknown
router01;lan0;192.168.1.1;up

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 10. Статистика событий по датам

Задача: разработать утилиту «статистика событий по датам». Рекомендуемые стандартные модули: csv, datetime, collections.Counter, json (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Прочитайте timestamp;level;message, распарсьте время формата %Y-%m-%d %H:%M через datetime.strptime().
  2. В собственном модуле реализуйте функции проверки времени, фильтрации интервала и подсчёта уровней.
  3. Отберите события за период с 1 по 7 октября 2026 года включительно; события вне периода не считаются ошибками.
  4. Подсчитайте частоты INFO, WARNING, ERROR, CRITICAL внутри периода и отдельно число критических (ERROR + CRITICAL).
  5. Сохраните report.json с period, by_level, critical_events, skipped_outside_period, invalid, датой.
  6. Проверьте неправильную дату, событие 8 октября и файл без событий в периоде.
  7. Добавьте by_day: число событий каждого уровня для каждой календарной даты выбранного периода; отсутствующие дни можно не записывать.

Исходные данные:

📄 Содержимое файла events.csv — раскрыть и скопировать
events.csv
timestamp;level;message
2026-10-01 09:00;INFO;Started
2026-10-01 09:10;ERROR;Connection lost
2026-10-02 10:00;WARNING;CPU high
2026-10-03 10:05;ERROR;Disk full
2026-10-05 11:00;INFO;Backup done
2026-10-07 15:00;ERROR;Auth failed
2026-10-08 12:00;ERROR;Outside period
bad-date;INFO;Test
2026-10-04 14:00;CRITICAL;Host offline

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 11. Сравнение наборов пакетов

Задача: разработать утилиту «сравнение наборов пакетов». Рекомендуемые стандартные модули: pathlib, collections.Counter, json, datetime (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Прочитайте два файла как списки пакетов; очистите строки и исключите пустые.
  2. В собственном модуле реализуйте чтение, нормализацию имён и сравнение множеств.
  3. Определите missing (требуются, но не установлены), extra (установлены, но не требуются), matched.
  4. При помощи Counter обнаружьте повторы в каждом входном файле и сохраните информацию о них.
  5. Сохраните report.json с missing, extra, matched, duplicates, количеством уникальных пакетов и датой.
  6. Проверьте одинаковые файлы, пустой файл и дублирование пакета.
  7. Добавьте coverage_percent: долю требуемых уникальных пакетов, которые уже установлены. Если требуемых пакетов нет, используйте null, а не делите на ноль.

Исходные данные:

Структура проекта для варианта 11:

  • Directorypractice_08/
    • main.py
    • utils.py
    • installed.txt
    • required.txt
    • report.json — формируется программой
📄 Содержимое файла installed.txt — раскрыть и скопировать
installed.txt
nginx
python3
git
curl
nano
ssh
nginx
📄 Содержимое файла required.txt — раскрыть и скопировать
required.txt
nginx
python3
git
docker
wget
ssh

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 12. Учёт занимаемого пространства

Задача: разработать утилиту «учёт занимаемого пространства». Рекомендуемые стандартные модули: csv, statistics, math, pathlib, json, datetime (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Прочитайте sizes.csv и проверьте размер: неотрицательное целое число в байтах.
  2. В собственном модуле напишите разбор, расчёт статистики и сортировку файлов по размеру.
  3. Вычислите среднее и медиану размеров; с помощью math.ceil рассчитайте размер каждого файла в КиБ как ceil(bytes / 1024).
  4. Определите топ-3 самых больших файлов и суммарный объём всех корректных записей.
  5. Сформируйте JSON-отчёт: total_bytes, mean_bytes, median_bytes, top3, invalid, generated_at.
  6. Проверьте размер 0, отрицательный размер и файл только с ошибками.
  7. Добавьте by_extension: суммарный объём файлов каждого расширения (для имён без расширения используйте "<без расширения>"); количество файлов считайте отдельно.

Исходные данные:

📄 Содержимое файла sizes.csv — раскрыть и скопировать
sizes.csv
filename;bytes
auth.log;14520
system.log;32100
config.txt;850
access.log;58700
hosts;420
backup.tar;1024000
invalid.txt;abc
huge.img;-5
index.html;4096

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 13. Анализ HTTP-ответов

Задача: разработать утилиту «анализ http-ответов». Рекомендуемые стандартные модули: csv, collections.Counter, json, datetime (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Прочитайте CSV и проверьте целочисленные HTTP-коды диапазона 100–599, непустой путь.
  2. В собственном модуле реализуйте классификацию кода, подсчёт частот и поиск проблемных URL.
  3. Классифицируйте ответы по первой цифре (1xx–5xx) и подсчитайте количество кодов каждой категории.
  4. Определите количество ошибок 4xx и 5xx и список путей, где они встречались (с количеством ошибок).
  5. Создайте JSON-отчёт с by_class, error_count, problem_paths, invalid, датой.
  6. Проверьте код 599/600, пустой путь и файл только с ответами 2xx.
  7. Добавьте server_error_paths: пути с хотя бы одним ответом 5xx, сортируя по числу таких ответов, затем по имени пути.

Исходные данные:

📄 Содержимое файла requests.csv — раскрыть и скопировать
requests.csv
path;status
/;200
/login;200
/api/users;500
/api/users;503
/health;200
/login;401
/admin;403
/catalog;404
/test;abc
/;700
/api/users;200
/login;200

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 14. Сверка учётных списков устройств

Задача: разработать утилиту «сверка учётных списков устройств». Рекомендуемые стандартные модули: csv, collections.Counter, pathlib, json, datetime (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Прочитайте оба файла через csv.DictReader, проверьте непустые id и host; повтор идентификатора внутри одного файла учитывайте как ошибку.
  2. В собственном модуле реализуйте чтение/проверку реестра и две функции сравнения.
  3. Найдите устройства, которые были запланированы, но не обнаружены, и устройства, обнаруженные вне плана.
  4. Для общих ID проверьте несовпадения имён хостов; отсортируйте результаты по ID.
  5. Создайте report.json с missing, unexpected, hostname_mismatch, invalid, датой.
  6. Проверьте повтор INV007, несовпадение имени устройства INV002, полное совпадение реестров и пустой фактический реестр.
  7. Добавьте match_percent: процент идентификаторов из плана, для которых устройство найдено с тем же именем. При пустом плане используйте null.

Исходные данные:

Структура проекта для варианта 14:

  • Directorypractice_08/
    • main.py
    • utils.py
    • planned.csv
    • actual.csv
    • report.json — формируется программой
📄 Содержимое файла planned.csv — раскрыть и скопировать
planned.csv
id;host
INV001;srv01
INV002;srv02
INV003;pc01
INV004;router01
INV005;printer01
INV006;backup01
📄 Содержимое файла actual.csv — раскрыть и скопировать
actual.csv
id;host
INV001;srv01
INV002;srv02-renamed
INV004;router01
INV006;backup01
INV007;unknown01
INV007;unknown02
INV008;pc02

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Вариант 15. Анализ резервного копирования

Задача: разработать утилиту «анализ резервного копирования». Рекомендуемые стандартные модули: csv, datetime, collections.Counter, statistics, json (выбирайте необходимые; нужно использовать не менее двух).

Программа должна:

  1. Прочитайте CSV, проверьте формат даты %Y-%m-%d %H:%M, допустимые результаты OK/FAILED и целый размер; OK требует положительного размера, FAILED — нулевого размера.
  2. В своём модуле реализуйте проверку записи, группировку по узлам и расчёт статистики резервного копирования.
  3. Подсчитайте количество операций OK и FAILED, а также число ошибок по каждому узлу с помощью Counter.
  4. С использованием statistics найдите средний размер успешной резервной копии; для отсутствующих успехов верните null в JSON.
  5. Создайте report.json с success, failed, invalid, mean_success_size_mb, failure_by_host, generated_at.
  6. Проверьте неверную дату, статус UNKNOWN и набор только из неудачных копий.
  7. Добавьте last_backup_by_host: для каждого узла определите результат последней корректной операции по времени и выделите узлы, чья последняя попытка завершилась неудачно.

Исходные данные:

📄 Содержимое файла backups.csv — раскрыть и скопировать
backups.csv
host;timestamp;result;size_mb
srv01;2026-10-01 02:00;OK;200
srv02;2026-10-01 02:05;FAILED;0
db01;2026-10-01 02:10;OK;910
srv01;2026-10-02 02:00;OK;220
backup01;2026-10-02 02:05;FAILED;0
srv02;2026-10-03 02:05;FAILED;0
srv03;2026-10-03 02:10;OK;130
srv04;bad-date;OK;50
srv05;2026-10-04 02:10;UNKNOWN;30
srv06;2026-10-04 02:20;OK;300

Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.


Требования к результату

Section titled “Требования к результату”
  1. Создайте папку проекта с main.py и собственным модулем utils.py или с именем из задания; перенесите в него как минимум три осмысленные функции: разбор/проверка, вычисление/группировка, формирование результата.
  2. В main.py организуйте чтение данных, вызовы собственного модуля и сохранение отчёта. Используйте конструкцию if __name__ == "__main__": main().
  3. Используйте модули json и datetime для отчёта и как минимум один дополнительный профильный модуль (csv, collections, statistics, pathlib, ipaddress, math — по задаче). Собственный модуль и builtins не входят в число модулей стандартной библиотеки.
  4. Корректно обрабатывайте пустые файлы, некорректные строки, отсутствующий файл и неверные значения полей. В отчёте укажите количество пропущенных записей, если в данных есть ошибки.
  5. Основной отчёт — report.json, если вариант не устанавливает другое название. Используйте json.dumps(..., ensure_ascii=False, indent=2) или json.dump().
  6. В отчёт включите дату формирования (datetime.now().isoformat(timespec="minutes")), суммарные показатели, проблемные записи/выборку, количество корректных и отбракованных строк.
  7. Не используйте pandas, requests, сторонние пакеты, классы и сетевые подключения. Работайте только с локальными учебными данными.
  8. В заданиях с CSV первая строка — заголовок, данные разделены ;. Пустые строки можно пропускать; ошибки остальных строк следует учитывать.

Структура проекта

Ниже показан пример для варианта 1. Файл cpu.csv замените входным файлом своего варианта, сохраняя его имя из условия. Если вариант предусматривает несколько входных файлов или папку logs, используйте структуру, указанную рядом с соответствующим вариантом.

  • Directorypractice_08/
    • main.py — точка входа и запуск анализа
    • utils.py — собственный модуль с функциями (имя можно изменить)
    • cpu.csv — входные данные, пример для варианта 1
    • report.json — формируется программой

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

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

Требования к представлению JSON-отчёта

В зависимости от варианта набор полей различается, но структура должна оставаться машиночитаемой. Пример оформления (это не готовый ответ для вариантов):

{
"generated_at": "2026-10-12T10:30",
"valid": 10,
"invalid": 2,
"summary": {
"active": 7,
"inactive": 3
},
"problem_items": [
{"name": "srv01", "reason": "inactive"}
]
}

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

  1. Что такое модуль и зачем его выделяют в отдельный файл?
  2. Чем отличаются import module и from module import name?
  3. Для чего используется if __name__ == "__main__"?
  4. Почему нежелательно выполнять чтение файлов при импорте вспомогательного модуля?
  5. Какова задача csv.DictReader? Почему надо проверять значения полей?
  6. Для чего нужны Path.glob() и Path.rglob()?
  7. Чем отличается statistics.mean() от statistics.median()?
  8. Когда пригодится collections.Counter?
  9. Почему json.dump() удобен для автоматической обработки отчётов?
  10. Для чего у json.dumps() используется ensure_ascii=False?
  11. Как обработать синтаксическую ошибку JSON?
  12. Как разобрать дату из строки с помощью datetime.strptime()?
  13. Как ipaddress помогает избежать ошибок при проверке адресов?
  14. Почему нельзя вычислять среднее без проверки на пустой набор?
  15. Как проверить совместную работу main.py и собственного модуля?

Рекомендуемая литература

Section titled “Рекомендуемая литература”
  1. Python: модули.
  2. Python: csv.
  3. Python: json.
  4. Python: pathlib.
  5. Python: statistics.
  6. Python: collections.Counter.
  7. Python: datetime.
  8. Python: ipaddress.