Практическая работа №8
Основные теоретические положения
Section titled “Основные теоретические положения”1. Импорт модулей
import statisticsfrom datetime import datetimefrom 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 mathimport 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 jsonfrom 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 (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Прочитайте
cpu.csvчерезcsv.DictReader, проверьте целые значения 0–100 и непустые имена узлов. Неисправные записи пропускайте. - В собственном модуле реализуйте функции
parse_cpu(),get_statistics()иget_critical(); их интерфейсы и возвращаемые типы определите самостоятельно. - Через
statisticsнайдите среднюю загрузку, медиану и максимум по всем корректным измерениям. - Сформируйте список уникальных имён узлов, у которых хотя бы одно измерение ≥ 85, сортируя по максимальной нагрузке (при равенстве — по имени).
- Создайте
report.jsonс полямиgenerated_at,total,invalid,mean,median,max,critical_hosts. - Проверьте порог 85, пустой CSV и нечисловое значение. Обработайте отсутствие измерений.
- Дополнительно сформируйте
by_host: для каждого имени узла рассчитайте число измерений и максимальную загрузку; не создавайте по одному объекту на каждое повторное измерение.
Исходные данные:
📄 Содержимое файла cpu.csv — раскрыть и скопировать
host;cpusrv01;45srv02;89db01;92srv01;64srv02;85pc01;30srv03;101srv04;abcbackup01;78srv05;0srv06;95Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.
Вариант 2. Учёт ошибок авторизации
Задача: разработать утилиту «учёт ошибок авторизации». Рекомендуемые стандартные модули: csv, collections.Counter, ipaddress, json, datetime (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Прочитайте файл через
csv.DictReader, проверьте наличие полей, допустимость результатаSUCCESS/FAILEDи корректность IP сipaddress.ip_address(). - В
utils.pyреализуйте функции проверки записи, выбора отказов и формирования частот по IP. - При помощи
Counterнайдите количество отказов на каждый IP и число уникальных источников ошибок. - Отберите IP с ≥ 2 отказами и отсортируйте по убыванию частоты, затем по IP-адресу как строке.
- Сохраните
report.json:generated_at,valid,invalid,failed,suspicious(список объектовip,count). - Проверьте недопустимый IP, неизвестный результат, файл без неудачных входов.
- Дополнительно вычислите
failed_by_user: число отказов для каждого пользователя; отсортируйте пользователей в отчёте по количеству отказов.
Исходные данные:
📄 Содержимое файла auth.csv — раскрыть и скопировать
ip;user;result192.168.1.10;admin;FAILED192.168.1.20;student;SUCCESS192.168.1.10;admin;FAILED192.168.1.15;guest;FAILED192.168.1.20;student;FAILED192.168.1.10;admin;FAILED192.168.1.30;operator;SUCCESS192.168.1.40;root;UNKNOWN;student;FAILED192.168.1.15;guest;FAILEDОжидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.
Вариант 3. Проверка адресного плана
Задача: разработать утилиту «проверка адресного плана». Рекомендуемые стандартные модули: csv, ipaddress, collections.Counter, json, datetime (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Прочитайте
hosts.csvи проверьте корректность адресов черезipaddress.ip_address; допустимы только IPv4 и непустые имена. - В собственном модуле реализуйте проверку IP, поиск адресов в подсети и подсчёт узлов по группам.
- Для каждого адреса определите принадлежность сети
192.168.1.0/24; посчитайте внутри и вне подсети. - Найдите повторяющиеся IPv4-адреса у разных узлов и сгруппируйте устройства по
group. - Создайте JSON-отчёт с
inside_subnet,outside_subnet,duplicates,by_group,invalidи датой. - Проверьте неверный IP, адрес сети
192.168.2.50и дублирование адреса. - Дополнительно сформируйте
by_group: количество устройств в каждой группе внутри и вне целевой подсети; пустое полеgroupсчитайте ошибкой.
Исходные данные:
📄 Содержимое файла hosts.csv — раскрыть и скопировать
host;ip;groupsrv01;192.168.1.10;serverssrv02;192.168.1.11;serverspc01;192.168.1.101;usersrouter01;192.168.1.1;networksrv03;10.0.0.5;serverspc02;192.168.1.102;usersprinter01;192.168.2.50;peripheralunknown;not_ip;usersbackup01;192.168.1.20;serverssrv04;192.168.1.11;serversОжидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.
Вариант 4. Анализ каталога журналов
Задача: разработать утилиту «анализ каталога журналов». Рекомендуемые стандартные модули: pathlib, collections.Counter, json, datetime (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Через
Path("logs").glob("*.log")найдите все файлы.log; отсутствие каталога отобразите понятным сообщением. - В собственном модуле реализуйте функции получения числа строк, определения уровня записи и формирования сводки.
- Для каждого файла подсчитайте общий объём в байтах и количество непустых строк.
- Посчитайте строки, содержащие
ERRORилиLOGIN_FAILED; сгруппируйте результаты по именам файлов. - Сохраните
report.jsonсfiles,total_bytes,total_lines,problem_lines,generated_at. - Проверьте добавление нового журнала, пустой файл и отсутствие каталога
logs. - Добавьте
most_problematic: имя файла с максимальным количеством проблемных строк. При равенстве выбирайте лексикографически первое имя; при отсутствии файлов используйтеnull.
Исходные данные:
Структура проекта для варианта 4:
Directorypractice_08/
main.pyutils.pyDirectorylogs
app.logauth.logsystem.log
report.json— формируется программой
📄 Содержимое файла logs/app.log — раскрыть и скопировать
INFO startedERROR connection lostWARNING slow query📄 Содержимое файла logs/auth.log — раскрыть и скопировать
LOGIN_SUCCESS adminLOGIN_FAILED studentLOGIN_FAILED guest📄 Содержимое файла logs/system.log — раскрыть и скопировать
INFO bootERROR disk fullОжидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.
Вариант 5. Контроль состояния служб
Задача: разработать утилиту «контроль состояния служб». Рекомендуемые стандартные модули: csv, collections.Counter, json, datetime (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Проверьте поля
host,service,status(active/inactive) и отбракуйте некорректные строки. - В отдельном модуле реализуйте
parse_service(), подсчёт по статусам и выбор служб с неполадками. - Через
Counterподсчитайте состояния по всем службам и для каждого узла. - Получите список узлов с минимум одной неактивной службой, сортируя по числу неактивных служб.
- Запишите
report.jsonсstatus_counts,hosts_with_problems,valid,invalid, датой. - Проверьте неизвестное состояние, пустое имя службы и файл, где все службы
active. - Добавьте
by_host: количествоactiveиinactiveпо каждому устройству. Вhosts_with_problemsвыводите узлы с точным числом неисправных служб.
Исходные данные:
📄 Содержимое файла services.csv — раскрыть и скопировать
host;service;statussrv01;ssh;activesrv01;nginx;inactivesrv01;cron;activesrv02;ssh;activesrv02;nginx;inactivedb01;postgresql;activedb01;backup;inactivesrv03;docker;activesrv04;nginx;brokensrv05;;activebackup01;ssh;inactiveОжидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.
Вариант 6. Измерения времени ответа
Задача: разработать утилиту «измерения времени ответа». Рекомендуемые стандартные модули: csv, statistics, math, json, datetime (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Прочитайте CSV и проверьте:
-1— недоступность, 0–500 — допустимое время в мс; остальные значения ошибочны. - В собственном модуле реализуйте проверку измерения, статистику успешных ответов и выбор медленных узлов.
- Через
statisticsнайдите среднее и медиану успешных ответов, черезmath.ceilокруглите среднее вверх. - Выделите значения > 80 мс, отсортируйте по убыванию задержки, рассчитайте процент недоступных.
- Создайте
report.json:online,offline,invalid,mean_ms,median_ms,slow_hosts,generated_at. - Проверьте только недоступные узлы, значение ровно 80 и нечисловой ввод.
- Добавьте
slow_by_host: количество измерений выше 80 мс для каждого узла. Обработайте повторные измерения одного и того же узла.
Исходные данные:
📄 Содержимое файла ping.csv — раскрыть и скопировать
host;latency_mssrv01;15srv02;-1router01;21srv03;109srv04;87backup01;35printer01;-1db01;58srv05;abcsrv06;0srv07;105srv08;999Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.
Вариант 7. Температурный мониторинг
Задача: разработать утилиту «температурный мониторинг». Рекомендуемые стандартные модули: csv, statistics, collections.Counter, json, datetime (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Проверьте целые значения температуры в диапазоне 0–120 °C и непустые имена узлов.
- В собственном модуле создайте функции чтения/проверки, вычисления статистики и определения состояния.
- Рассчитайте среднее, медиану и максимальную температуру по валидным значениям.
- Присвойте категории:
normal< 70,warning70–79,critical≥ 80; получите частоты категорий. - Создайте JSON-отчёт с частотами,
mean,median,max, списком критических узлов и датой. - Проверьте температуру 70/80/120, файл из одних ошибок, отсутствие критических значений.
- Добавьте
per_host: для каждого корректного измерения сохраняйте имя, значение и категорию; отсортируйте список по температуре по убыванию.
Исходные данные:
📄 Содержимое файла sensors.csv — раскрыть и скопировать
host;temperature_csrv01;42srv02;75db01;88router01;55srv03;91srv04;80printer01;38srv05;121srv06;errorbackup01;66db02;87srv07;0Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.
Вариант 8. Проверка JSON-конфигурации
Задача: разработать утилиту «проверка json-конфигурации». Рекомендуемые стандартные модули: json, ipaddress, pathlib, datetime (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Прочитайте файл
settings.jsonс помощьюjson.loads()илиjson.load(); отдельно обработайте отсутствующий файл и синтаксическую ошибку JSON. - В собственном модуле реализуйте функции проверки обязательных ключей, числовых границ и IP-параметров.
- Проверьте, что
server— IPv4,port1–65535,timeout1–300,retries0–10,debug— логическое значение. - Проверьте через
ipaddress.ip_network(), что адрес сервера входит вallowed_network. - Сформируйте
report.json:valid_config,errors,server_in_allowed_network,generated_at. - Проверьте отсутствующий
port, строковое значение порта и недопустимую маску подсети. - Добавьте
checked_fields: перечень проверенных параметров с признаком успеха/ошибки; не прекращайте проверку после первой ошибки, если 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 (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Проверьте четыре поля, допустимость IP по
ipaddressи значения статусаup/down. - В собственном модуле реализуйте разбор записи, статистику интерфейсов по состоянию и анализ по устройствам.
- Подсчитайте число
up/downи количество устройств с хотя бы однимdown. - Определите, сколько корректных интерфейсов принадлежит сети
192.168.1.0/24. - Запишите JSON-отчёт:
statuses,in_subnet,devices_with_down,invalid, дату. - Проверьте неверный IP, неизвестный статус и граничный адрес сети.
- Добавьте
by_device: для каждого устройства число исправных и отключённых интерфейсов. Не дублируйте имена вdevices_with_down.
Исходные данные:
📄 Содержимое файла interfaces.csv — раскрыть и скопировать
device;interface;ip;statussrv01;eth0;192.168.1.10;upsrv01;eth1;10.0.0.10;downrouter01;wan0;203.0.113.2;upsrv02;eth0;192.168.1.11;upprinter01;wlan0;192.168.1.50;downdb01;ens18;192.168.1.20;upsrv03;eth0;wrong-ip;upsrv04;eth0;192.168.1.12;unknownrouter01;lan0;192.168.1.1;upОжидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.
Вариант 10. Статистика событий по датам
Задача: разработать утилиту «статистика событий по датам». Рекомендуемые стандартные модули: csv, datetime, collections.Counter, json (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Прочитайте
timestamp;level;message, распарсьте время формата%Y-%m-%d %H:%Mчерезdatetime.strptime(). - В собственном модуле реализуйте функции проверки времени, фильтрации интервала и подсчёта уровней.
- Отберите события за период с 1 по 7 октября 2026 года включительно; события вне периода не считаются ошибками.
- Подсчитайте частоты
INFO,WARNING,ERROR,CRITICALвнутри периода и отдельно число критических (ERROR+CRITICAL). - Сохраните
report.jsonсperiod,by_level,critical_events,skipped_outside_period,invalid, датой. - Проверьте неправильную дату, событие 8 октября и файл без событий в периоде.
- Добавьте
by_day: число событий каждого уровня для каждой календарной даты выбранного периода; отсутствующие дни можно не записывать.
Исходные данные:
📄 Содержимое файла events.csv — раскрыть и скопировать
timestamp;level;message2026-10-01 09:00;INFO;Started2026-10-01 09:10;ERROR;Connection lost2026-10-02 10:00;WARNING;CPU high2026-10-03 10:05;ERROR;Disk full2026-10-05 11:00;INFO;Backup done2026-10-07 15:00;ERROR;Auth failed2026-10-08 12:00;ERROR;Outside periodbad-date;INFO;Test2026-10-04 14:00;CRITICAL;Host offlineОжидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.
Вариант 11. Сравнение наборов пакетов
Задача: разработать утилиту «сравнение наборов пакетов». Рекомендуемые стандартные модули: pathlib, collections.Counter, json, datetime (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Прочитайте два файла как списки пакетов; очистите строки и исключите пустые.
- В собственном модуле реализуйте чтение, нормализацию имён и сравнение множеств.
- Определите
missing(требуются, но не установлены),extra(установлены, но не требуются),matched. - При помощи
Counterобнаружьте повторы в каждом входном файле и сохраните информацию о них. - Сохраните
report.jsonсmissing,extra,matched,duplicates, количеством уникальных пакетов и датой. - Проверьте одинаковые файлы, пустой файл и дублирование пакета.
- Добавьте
coverage_percent: долю требуемых уникальных пакетов, которые уже установлены. Если требуемых пакетов нет, используйтеnull, а не делите на ноль.
Исходные данные:
Структура проекта для варианта 11:
Directorypractice_08/
main.pyutils.pyinstalled.txtrequired.txtreport.json— формируется программой
📄 Содержимое файла installed.txt — раскрыть и скопировать
nginxpython3gitcurlnanosshnginx📄 Содержимое файла required.txt — раскрыть и скопировать
nginxpython3gitdockerwgetsshОжидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.
Вариант 12. Учёт занимаемого пространства
Задача: разработать утилиту «учёт занимаемого пространства». Рекомендуемые стандартные модули: csv, statistics, math, pathlib, json, datetime (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Прочитайте
sizes.csvи проверьте размер: неотрицательное целое число в байтах. - В собственном модуле напишите разбор, расчёт статистики и сортировку файлов по размеру.
- Вычислите среднее и медиану размеров; с помощью
math.ceilрассчитайте размер каждого файла в КиБ какceil(bytes / 1024). - Определите топ-3 самых больших файлов и суммарный объём всех корректных записей.
- Сформируйте JSON-отчёт:
total_bytes,mean_bytes,median_bytes,top3,invalid,generated_at. - Проверьте размер 0, отрицательный размер и файл только с ошибками.
- Добавьте
by_extension: суммарный объём файлов каждого расширения (для имён без расширения используйте"<без расширения>"); количество файлов считайте отдельно.
Исходные данные:
📄 Содержимое файла sizes.csv — раскрыть и скопировать
filename;bytesauth.log;14520system.log;32100config.txt;850access.log;58700hosts;420backup.tar;1024000invalid.txt;abchuge.img;-5index.html;4096Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.
Вариант 13. Анализ HTTP-ответов
Задача: разработать утилиту «анализ http-ответов». Рекомендуемые стандартные модули: csv, collections.Counter, json, datetime (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Прочитайте CSV и проверьте целочисленные HTTP-коды диапазона 100–599, непустой путь.
- В собственном модуле реализуйте классификацию кода, подсчёт частот и поиск проблемных URL.
- Классифицируйте ответы по первой цифре (
1xx–5xx) и подсчитайте количество кодов каждой категории. - Определите количество ошибок 4xx и 5xx и список путей, где они встречались (с количеством ошибок).
- Создайте JSON-отчёт с
by_class,error_count,problem_paths,invalid, датой. - Проверьте код 599/600, пустой путь и файл только с ответами 2xx.
- Добавьте
server_error_paths: пути с хотя бы одним ответом 5xx, сортируя по числу таких ответов, затем по имени пути.
Исходные данные:
📄 Содержимое файла 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 (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Прочитайте оба файла через
csv.DictReader, проверьте непустыеidиhost; повтор идентификатора внутри одного файла учитывайте как ошибку. - В собственном модуле реализуйте чтение/проверку реестра и две функции сравнения.
- Найдите устройства, которые были запланированы, но не обнаружены, и устройства, обнаруженные вне плана.
- Для общих ID проверьте несовпадения имён хостов; отсортируйте результаты по ID.
- Создайте
report.jsonсmissing,unexpected,hostname_mismatch,invalid, датой. - Проверьте повтор
INV007, несовпадение имени устройстваINV002, полное совпадение реестров и пустой фактический реестр. - Добавьте
match_percent: процент идентификаторов из плана, для которых устройство найдено с тем же именем. При пустом плане используйтеnull.
Исходные данные:
Структура проекта для варианта 14:
Directorypractice_08/
main.pyutils.pyplanned.csvactual.csvreport.json— формируется программой
📄 Содержимое файла planned.csv — раскрыть и скопировать
id;hostINV001;srv01INV002;srv02INV003;pc01INV004;router01INV005;printer01INV006;backup01📄 Содержимое файла actual.csv — раскрыть и скопировать
id;hostINV001;srv01INV002;srv02-renamedINV004;router01INV006;backup01INV007;unknown01INV007;unknown02INV008;pc02Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.
Вариант 15. Анализ резервного копирования
Задача: разработать утилиту «анализ резервного копирования». Рекомендуемые стандартные модули: csv, datetime, collections.Counter, statistics, json (выбирайте необходимые; нужно использовать не менее двух).
Программа должна:
- Прочитайте CSV, проверьте формат даты
%Y-%m-%d %H:%M, допустимые результатыOK/FAILEDи целый размер;OKтребует положительного размера,FAILED— нулевого размера. - В своём модуле реализуйте проверку записи, группировку по узлам и расчёт статистики резервного копирования.
- Подсчитайте количество операций
OKиFAILED, а также число ошибок по каждому узлу с помощьюCounter. - С использованием
statisticsнайдите средний размер успешной резервной копии; для отсутствующих успехов вернитеnullв JSON. - Создайте
report.jsonсsuccess,failed,invalid,mean_success_size_mb,failure_by_host,generated_at. - Проверьте неверную дату, статус
UNKNOWNи набор только из неудачных копий. - Добавьте
last_backup_by_host: для каждого узла определите результат последней корректной операции по времени и выделите узлы, чья последняя попытка завершилась неудачно.
Исходные данные:
📄 Содержимое файла backups.csv — раскрыть и скопировать
host;timestamp;result;size_mbsrv01;2026-10-01 02:00;OK;200srv02;2026-10-01 02:05;FAILED;0db01;2026-10-01 02:10;OK;910srv01;2026-10-02 02:00;OK;220backup01;2026-10-02 02:05;FAILED;0srv02;2026-10-03 02:05;FAILED;0srv03;2026-10-03 02:10;OK;130srv04;bad-date;OK;50srv05;2026-10-04 02:10;UNKNOWN;30srv06;2026-10-04 02:20;OK;300Ожидаемый результат: итоговые данные берутся только из файла, не подставляются константами. После выполнения должен появиться валидный report.json. Если входные данные изменяются, содержимое отчёта должно пересчитываться.
Требования к результату
Section titled “Требования к результату”- Создайте папку проекта с
main.pyи собственным модулемutils.pyили с именем из задания; перенесите в него как минимум три осмысленные функции: разбор/проверка, вычисление/группировка, формирование результата. - В
main.pyорганизуйте чтение данных, вызовы собственного модуля и сохранение отчёта. Используйте конструкциюif __name__ == "__main__": main(). - Используйте модули
jsonиdatetimeдля отчёта и как минимум один дополнительный профильный модуль (csv,collections,statistics,pathlib,ipaddress,math— по задаче). Собственный модуль иbuiltinsне входят в число модулей стандартной библиотеки. - Корректно обрабатывайте пустые файлы, некорректные строки, отсутствующий файл и неверные значения полей. В отчёте укажите количество пропущенных записей, если в данных есть ошибки.
- Основной отчёт —
report.json, если вариант не устанавливает другое название. Используйтеjson.dumps(..., ensure_ascii=False, indent=2)илиjson.dump(). - В отчёт включите дату формирования (
datetime.now().isoformat(timespec="minutes")), суммарные показатели, проблемные записи/выборку, количество корректных и отбракованных строк. - Не используйте
pandas,requests, сторонние пакеты, классы и сетевые подключения. Работайте только с локальными учебными данными. - В заданиях с CSV первая строка — заголовок, данные разделены
;. Пустые строки можно пропускать; ошибки остальных строк следует учитывать.
Структура проекта
Ниже показан пример для варианта 1. Файл cpu.csv замените входным файлом своего варианта, сохраняя его имя из условия. Если вариант предусматривает несколько входных файлов или папку logs, используйте структуру, указанную рядом с соответствующим вариантом.
Directorypractice_08/
main.py— точка входа и запуск анализаutils.py— собственный модуль с функциями (имя можно изменить)cpu.csv— входные данные, пример для варианта 1report.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"} ]}Количество, суммы, проценты и другие числовые показатели храните как числа, а не строковые значения. Не используйте значения из примера отчёта без расчёта.
Контрольные вопросы
Section titled “Контрольные вопросы”- Что такое модуль и зачем его выделяют в отдельный файл?
- Чем отличаются
import moduleиfrom module import name? - Для чего используется
if __name__ == "__main__"? - Почему нежелательно выполнять чтение файлов при импорте вспомогательного модуля?
- Какова задача
csv.DictReader? Почему надо проверять значения полей? - Для чего нужны
Path.glob()иPath.rglob()? - Чем отличается
statistics.mean()отstatistics.median()? - Когда пригодится
collections.Counter? - Почему
json.dump()удобен для автоматической обработки отчётов? - Для чего у
json.dumps()используетсяensure_ascii=False? - Как обработать синтаксическую ошибку JSON?
- Как разобрать дату из строки с помощью
datetime.strptime()? - Как
ipaddressпомогает избежать ошибок при проверке адресов? - Почему нельзя вычислять среднее без проверки на пустой набор?
- Как проверить совместную работу
main.pyи собственного модуля?