Skip to content

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

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

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

1. Объявление функции, параметры и возвращаемое значение

def classify_load(value, limit):
if value >= limit:
return "critical"
return "normal"
print(classify_load(87, 80)) # critical
  • value и limit — параметры, а 87 и 80 — аргументы.
  • return возвращает вычисленный результат вызывающему коду.
  • Не смешивайте вычисление результата с его выводом на экран: функция анализа должна возвращать данные, а не печатать их.

2. Декомпозиция задачи

Одну задачу обработки файла удобно разделить на этапы:

main()
├── read_records(filename) → прочитать и проверить данные
│ └── parse_record(line) → разобрать одну строку
├── analyze(records) → получить показатели
├── select_problematic(records)→ выбрать проблемные записи
├── build_report(...) → сформировать текст отчёта
└── write_report(filename, text) → сохранить текст

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


3. Обработка некорректной строки

def parse_number(text):
value = int(text.strip())
if not 0 <= value <= 100:
raise ValueError("Значение вне диапазона 0–100")
return value

Использование в цикле чтения:

lines = ["45", "abc", "101", "80"]
for line_number, line in enumerate(lines, start=1):
try:
number = parse_number(line)
except ValueError as error:
print(f"Строка {line_number}: {error}")
continue
print("Корректное значение:", number)

Чтение файла и проверку формата лучше разделять: первая функция управляет файлом, вторая — разбирает одну строку.


4. Возврат нескольких результатов

def summarize(values):
if not values:
return 0, None
return len(values), sum(values) / len(values)
count, average = summarize([10, 20, 30])

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


5. Формирование отчёта отдельно от анализа

def build_summary(total, critical):
return f"Всего записей: {total}\nПроблемных: {critical}\n"
report = build_summary(12, 3)
with open("report.txt", "w", encoding="utf-8") as file:
file.write(report)

6. Проверка функций с помощью assert

assert classify_load(80, 80) == "critical"
assert classify_load(79, 80) == "normal"

Если условие истинно, выполнение продолжается. Если ложно — возникает AssertionError. Проверяйте минимум две функции отдельно от работы с файлом.

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

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

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

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


Задание 1.1. Функция, параметры и return

Создайте функцию classify_cpu(value, limit), которая возвращает "critical", если загрузка не меньше порога, иначе "normal".

  • Вызовите функцию со значениями (85, 85), (84, 85) и (0, 85).
  • Объясните, почему для результата используется return, а не print() внутри функции.

Задание 1.2. Функция и коллекция

Создайте функцию get_critical(values, limit), возвращающую новый список значений, превышающих предел. Проверьте её на [40, 90, 85, 15, 100] при пороге 85.

  • Исходный список изменяться не должен.
  • Покажите, что получится для пустого списка.

Задание 1.3. Разделение обработки данных

Напишите parse_record(line), которая разбирает запись вида srv01;87 и возвращает (имя_узла, загрузка). Пустое имя, неправильное число полей и значение вне диапазона 0–100 должны приводить к ValueError.

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


Задание 1.4. Декомпозиция и проверка функций

Составьте схему вызовов для программы, которая читает значения, вычисляет показатели и записывает отчёт. Добавьте минимум два выражения assert для функций из заданий 1.1–1.3.


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

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

Вариант 1. Учёт сетевых узлов

Задача: разработать консольную утилиту «учёт сетевых узлов». Вход: hosts.txt. Выход: hosts_report.txt.

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

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

  1. Нормализуйте имя узла (пробелы, регистр), разбейте строку на три поля. Пустое имя, неправильное число полей и повтор имени считайте ошибкой.
  2. Постройте словарь имя → (IP, тип) и посчитайте узлы каждого типа.
  3. Выделите все узлы типа server, отсортируйте их по имени и определите их долю среди корректных записей в процентах.
  4. В отчёте выведите все серверы с IP, статистику типов, количество корректных и ошибочных строк, номера ошибочных строк.
  5. Доработайте функцию поиска: пользователь вводит имя узла, программа возвращает его IP и тип или сообщает об отсутствии.
  6. Проверьте пустой файл, повтор имени с другим регистром и строку с лишним разделителем.
  7. Добавьте режим отбора по типу: пользователь вводит server, router, printer или другой тип; выведите отсортированные записи найденного типа и число совпадений. Режим поиска по имени из п. 5 сохраните.

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

📄 Содержимое файла hosts.txt — раскрыть и скопировать
hosts.txt
SRV01;192.168.1.10;server
pc-101;192.168.1.101;workstation
srv02;192.168.1.11;server
router01;192.168.1.1;router
backup01;192.168.1.20;server
;192.168.1.33;server
srv03;192.168.1.12;server
printer01;192.168.1.50;printer
invalid-record
srv02;192.168.1.99;server
pc-102;192.168.1.102;workstation
switch01;192.168.1.2;switch

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


Вариант 2. Анализ загрузки процессоров

Задача: разработать консольную утилиту «анализ загрузки процессоров». Вход: cpu.txt. Выход: cpu_report.txt.

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

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

  1. Разберите строки узел;загрузка. Допустимые значения загрузки CPU — 0–100, ошибки записей фиксируйте по номерам, пустые строки пропускайте.
  2. Для каждого узла соберите список всех его измерений и рассчитайте среднюю и максимальную загрузку.
  3. Критический узел — тот, у которого есть измерение ≥ 85. Выведите такие узлы в порядке убывания максимума, при равенстве — по имени.
  4. Рассчитайте среднюю загрузку по всем корректным измерениям, количество критических узлов и количество ошибок.
  5. Сформируйте текстовый отчёт с таблицей узел — средняя — максимум — состояние и итогами.
  6. Проверьте варианты: все измерения ниже порога; узел с одним измерением; файл только с ошибками.
  7. Добавьте в отчёт три узла с наибольшей средней загрузкой. Если измерений меньше трёх, выведите все доступные; при равенстве средней сортируйте по имени.

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

📄 Содержимое файла cpu.txt — раскрыть и скопировать
cpu.txt
srv01;45
srv02;92
db01;84
srv01;78
srv03;101
router01;33
srv02;88
pc01;error
db01;89
srv04;0
srv05;100
srv06;67

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


Вариант 3. Анализ попыток входа

Задача: разработать консольную утилиту «анализ попыток входа». Вход: auth.txt. Выход: auth_report.txt.

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

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

  1. Разберите поля IP;пользователь;событие, допускайте только SUCCESS или FAILED; форматные ошибки фиксируйте.
  2. Подсчитайте успешные и неудачные входы и количество уникальных IP с ошибками.
  3. Постройте словарь количества неудачных попыток по IP и выделите IP с ≥ 2 отказами.
  4. Отсортируйте проблемные IP по убыванию числа отказов; при равенстве — по IP как строке.
  5. В отчёте отразите общие счётчики, список подозрительных IP, количество плохих строк и их номера.
  6. Проверьте файл только с успешными входами, неверным статусом и отсутствующим полем пользователя.
  7. Дополнительно сгруппируйте отказы по имени пользователя и найдите пользователя с наибольшим числом ошибок. При равенстве выбирайте имя по алфавиту.

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

📄 Содержимое файла auth.txt — раскрыть и скопировать
auth.txt
192.168.1.15;admin;FAILED
192.168.1.20;student;SUCCESS
192.168.1.15;admin;FAILED
192.168.1.30;ivanov;FAILED
192.168.1.20;student;FAILED
192.168.1.15;guest;FAILED
192.168.1.30;ivanov;SUCCESS
192.168.1.40;root;FAILED
bad;data
192.168.1.15;admin;UNKNOWN
192.168.1.20;student;SUCCESS

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


Вариант 4. Контроль задержек сети

Задача: разработать консольную утилиту «контроль задержек сети». Вход: ping.txt. Выход: ping_report.txt.

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

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

  1. Разберите узел;время_мс: -1 означает недоступность, 0–500 мс — успешный ответ; остальное — ошибка.
  2. Подсчитайте доступные, недоступные измерения (не уникальные имена узлов) и процент недоступных от числа корректных записей.
  3. Вычислите среднее время только успешных ответов; предусмотрите отсутствие успешных ответов.
  4. Выделите узлы с задержкой более 80 мс, отсортируйте по убыванию времени.
  5. Сохраните детальный отчёт (обобщение, медленные узлы, номера некорректных строк).
  6. Проверьте файл из одних -1, задержку ровно 80 и нечисловое значение.
  7. Реализуйте изменяемый порог задержки: пользователь вводит целое число от 0 до 500, программа повторно строит список медленных узлов без повторного чтения исходного файла.

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

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

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


Вариант 5. Проверка состояния служб

Задача: разработать консольную утилиту «проверка состояния служб». Вход: services.txt. Выход: services_report.txt.

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

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

  1. Разберите узел;служба;состояние: статусы — active и inactive. Повтор пары узел + служба считайте ошибкой.
  2. Создайте словарь по узлам, где каждому узлу соответствует список его служб и их состояний.
  3. Подсчитайте активные и неактивные службы для каждого узла, а также общий итог.
  4. Выделите узлы с хотя бы одной неактивной службой; сортируйте их по убыванию количества неактивных служб.
  5. Сформируйте отчёт с детализацией по узлам и перечнем некорректных строк.
  6. Проверьте повтор записи, неизвестный статус и случай без неактивных служб.
  7. Добавьте поиск по имени службы: вывести все узлы, где указанная служба неактивна, и число таких узлов. Неопознанную службу обрабатывайте без ошибки.

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

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

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


Вариант 6. Анализ заполнения дисков

Задача: разработать консольную утилиту «анализ заполнения дисков». Вход: disks.txt. Выход: disks_report.txt.

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

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

  1. Разберите узел;раздел;заполнение, значение в процентах 0–100.
  2. Создайте перечень корректных разделов и сгруппируйте их по узлам.
  3. Отметьте критические разделы с заполнением ≥ 85 % и отсортируйте по убыванию процента, затем по имени узла.
  4. Для каждого узла определите максимальную загрузку раздела и подсчитайте число критических разделов.
  5. Сформируйте отчёт с общим числом разделов, критическим списком и номерами некорректных строк.
  6. Проверьте пороги 84/85, нечисловое значение и отсутствие критических разделов.
  7. Сформируйте дополнительную сводку по узлам: количество разделов, число критических разделов и максимум заполнения; выведите топ-3 узлов по максимальному заполнению.

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

📄 Содержимое файла disks.txt — раскрыть и скопировать
disks.txt
srv01;/;75
srv01;/var;91
srv02;/;86
srv02;/home;48
db01;/data;94
backup01;/backup;82
pc01;C:;67
srv03;/;105
db01;/logs;88
printer01;/;abc
srv04;/;85
srv05;/;0

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


Вариант 7. Инвентаризация интерфейсов

Задача: разработать консольную утилиту «инвентаризация интерфейсов». Вход: interfaces.txt. Выход: interfaces_report.txt.

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

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

  1. Разберите узел;интерфейс;состояние. Допустимы up/down; повтор пары узел + интерфейс — ошибка.
  2. Сформируйте словарь устройств с перечнями их интерфейсов.
  3. Подсчитайте все интерфейсы, число отключённых и долю отключённых в процентах.
  4. Выделите все узлы, у которых есть интерфейсы down; отсортируйте по числу отключённых, затем по имени.
  5. В отчёте укажите отключённые интерфейсы каждого узла и ошибки входных данных.
  6. Проверьте повтор, пустое имя интерфейса и случай, где все интерфейсы работают.
  7. Добавьте поиск интерфейсов по узлу: вывести отсортированные интерфейсы указанного устройства и число отключённых; если узел не найден — сообщение.

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

📄 Содержимое файла interfaces.txt — раскрыть и скопировать
interfaces.txt
srv01;eth0;up
srv01;eth1;down
srv02;eth0;up
srv02;eth1;down
db01;ens18;up
router01;wan0;down
router01;lan0;up
srv01;eth1;up
printer01;wlan0;down
switch01;port1;up
srv03;;up
srv04;eth0;unknown

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


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

Задача: разработать консольную утилиту «анализ резервного копирования». Вход: backups.txt. Выход: backup_report.txt.

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

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

  1. Разберите узел;результат;объём_МБ. Допускайте OK с положительным размером, FAILED с нулём; остальные записи ошибочны.
  2. Подсчитайте успешные и неудачные операции и суммарный объём успешных копий.
  3. Постройте статистику по узлам: сколько успешных и неудачных попыток было у каждого.
  4. Выделите узлы с хотя бы одной ошибкой, отсортируйте по числу неудач и по имени.
  5. Создайте отчёт с суммарным объёмом, статистикой по узлам и списком некорректных строк.
  6. Проверьте неверный статус, OK с объёмом 0 и отсутствие неудачных копирований.
  7. Рассчитайте для каждого узла долю неудачных операций в процентах от всех его попыток. Включите в отчёт узлы, у которых доля ошибок составляет не менее 50%.

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

📄 Содержимое файла backups.txt — раскрыть и скопировать
backups.txt
srv01;OK;240
srv02;FAILED;0
db01;OK;910
srv01;OK;260
backup01;FAILED;0
db01;FAILED;0
srv03;OK;130
srv04;OK;abc
srv05;UNKNOWN;50
srv02;FAILED;0
srv06;OK;80
srv07;OK;300

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


Вариант 9. Проверка открытых портов

Задача: разработать консольную утилиту «проверка открытых портов». Вход: ports.txt. Выход: ports_report.txt.

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

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

  1. Разберите узел;порт;состояние: порт — целое 1–65535, статус open/closed; повтор узла и порта считайте ошибкой.
  2. Определите открытые и закрытые порты, а также количество открытых портов у каждого узла.
  3. Разделите открытые порты на диапазоны 1–1023 и 1024–65535.
  4. Выделите все узлы, у которых открыто не менее двух портов; отсортируйте по убыванию количества.
  5. Сформируйте отчёт с найденными узлами, количеством портов по диапазонам и ошибками.
  6. Проверьте порты 1/65535, повтор пары и нечисловой порт.
  7. Реализуйте поиск портов указанного узла: вывести открытые порты по возрастанию номера и число закрытых; при отсутствии узла вывести сообщение.

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

📄 Содержимое файла ports.txt — раскрыть и скопировать
ports.txt
srv01;22;open
srv01;80;open
srv01;443;closed
srv02;22;open
srv02;3306;open
db01;5432;open
router01;8080;closed
srv03;0;open
srv04;70000;open
srv05;ssh;open
srv02;3306;open
srv06;53;closed

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


Вариант 10. Инвентаризация оборудования

Задача: разработать консольную утилиту «инвентаризация оборудования». Вход: inventory.txt. Выход: inventory_report.txt.

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

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

  1. Разберите инвентарный_номер;тип;аудитория. Непустые поля обязательны, номер должен быть уникальным.
  2. Создайте словарь оборудования по инвентарному номеру.
  3. Подсчитайте количество устройств каждого типа и в каждой аудитории.
  4. Выделите аудитории с не менее тремя устройствами и отсортируйте по убыванию количества.
  5. В отчёте приведите общую статистику, список аудиторий, данные об ошибочных строках.
  6. Проверьте повтор номера, пустую аудиторию и файл с одной записью.
  7. Добавьте поиск оборудования в выбранной аудитории: пользователь вводит аудиторию, программа выводит отсортированные по инвентарному номеру записи и подсчёт по типам.

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

📄 Содержимое файла inventory.txt — раскрыть и скопировать
inventory.txt
INV001;switch;A101
INV002;router;A101
INV003;pc;B204
INV004;printer;B204
INV005;server;S001
INV006;server;S001
INV007;pc;A101
INV003;pc;B205
INV008;switch;
broken-record
INV009;router;A101
INV010;pc;B204

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


Вариант 11. Контроль температуры оборудования

Задача: разработать консольную утилиту «контроль температуры оборудования». Вход: temperature.txt. Выход: temperature_report.txt.

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

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

  1. Разберите узел;температура (целое число 0–120 °C), пропускайте ошибочные строки.
  2. Рассчитайте минимум, максимум и среднюю температуру по корректным записям.
  3. Выделите перегретые устройства при температуре ≥ 80 °C, отсортируйте по убыванию температуры.
  4. Создайте словарь узел → температура и функцию поиска по имени.
  5. В отчёте укажите перечень перегретых, итоги и номера невалидных строк.
  6. Проверьте граничное значение 80, пустой файл и отсутствие перегрева.
  7. Добавьте режим проверки произвольного порога от 0 до 120 °C: пользователь вводит порог и получает список устройств с температурой не ниже указанной.

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

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

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


Вариант 12. Проверка прав пользователей

Задача: разработать консольную утилиту «проверка прав пользователей». Вход: permissions.txt. Выход: permissions_report.txt.

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

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

  1. Разберите пользователь;роль;состояние. Роли admin, operator, user, guest; состояния active/inactive; повтор имени — ошибка.
  2. Создайте словарь учётных записей и подсчитайте пользователей по ролям и состояниям.
  3. Выделите неактивных администраторов и всех активных гостей (две независимые группы риска).
  4. Отсортируйте итоговые списки по имени пользователя.
  5. В отчёте выведите обе группы риска, общие числа и номера ошибочных строк.
  6. Проверьте повтор имени, неизвестную роль и случай без пользователей группы риска.
  7. Добавьте поиск учётной записи по имени: вернуть роль и состояние. Отдельно посчитайте долю неактивных пользователей от общего числа корректных записей.

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

📄 Содержимое файла permissions.txt — раскрыть и скопировать
permissions.txt
admin;admin;active
student01;user;active
guest;guest;inactive
petrov;admin;active
ivanov;user;inactive
root;admin;inactive
operator;operator;active
student02;user;active
admin;user;active
student03;unknown;active
test;guest;inactive
visitor;guest;active

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


Вариант 13. Анализ уровней системного журнала

Задача: разработать консольную утилиту «анализ уровней системного журнала». Вход: events.txt. Выход: events_report.txt.

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

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

  1. Разберите время;уровень;сообщение, используя split(";", 2). Допустимые уровни: INFO, WARNING, ERROR, CRITICAL; проверять календарную дату пока не требуется.
  2. Подсчитайте число событий каждого уровня и общее количество корректных записей.
  3. Выделите ERROR и CRITICAL как важные события и определите их долю.
  4. Сортируйте важные события по времени-строке ISO по возрастанию; при равном времени сохраняйте порядок появления.
  5. В отчёте отразите сводку по уровням, все важные события и перечень ошибочных строк.
  6. Проверьте неизвестный уровень, пустое сообщение и отсутствие важных событий.
  7. Реализуйте отбор по выбранному уровню журнала: пользователь вводит один из четырёх уровней, программа выводит события этого уровня по времени и количество записей.

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

📄 Содержимое файла events.txt — раскрыть и скопировать
events.txt
2026-10-01T09:00;INFO;Service started
2026-10-01T09:05;WARNING;High memory
2026-10-01T09:10;ERROR;Disk full
2026-10-01T09:15;INFO;Backup done
2026-10-01T09:20;CRITICAL;Server unreachable
2026-10-01T09:25;ERROR;Auth denied
2026-10-01T09:30;WARNING;High CPU
invalid line
2026-10-01T09:35;DEBUG;Unexpected value
2026-10-01T09:40;INFO;Heartbeat
2026-10-01T09:45;ERROR;Network timeout

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


Вариант 14. Разбор конфигурационного файла

Задача: разработать консольную утилиту «разбор конфигурационного файла». Вход: settings.conf. Выход: config_report.txt.

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

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

  1. Создайте функцию разбора ключ = значение с удалением пробелов; пропускайте пустые строки и строки, начинающиеся с #.
  2. Не допускайте повторные ключи, строки без = и пустые имена/значения; ошибки фиксируйте.
  3. Соберите словарь настроек и выведите все пары в алфавитном порядке ключей.
  4. Для числовых параметров port, timeout, retries, max_clients проверьте целое число и границы: порт 1–65535, остальные 0–10000.
  5. Сформируйте отчёт с параметрами, их количеством и номерами ошибочных строк.
  6. Проверьте повтор ключа, параметр с двумя символами = и файл только с комментариями.
  7. Реализуйте поиск значения параметра: пользователь вводит имя ключа, программа выводит значение или сообщает об отсутствии; ошибочная строка не должна менять ранее принятую настройку.

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

📄 Содержимое файла settings.conf — раскрыть и скопировать
settings.conf
# Service settings
host = 192.168.1.10
port = 8080
timeout = 30
retries = 5
debug = false
port = 9090
no_equals_sign
empty =
max_clients = 200
log_level = warning

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


Вариант 15. Учёт доступности серверов

Задача: разработать консольную утилиту «учёт доступности серверов». Вход: availability.txt. Выход: availability_report.txt.

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

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

  1. Разберите узел;время_работы_часов;состояние: время — неотрицательное целое, статусы online/offline; для offline время должно быть 0.
  2. Подсчитайте доступные и недоступные узлы и процент доступности.
  3. Для доступных узлов вычислите среднее и максимальное время работы.
  4. Выделите доступные узлы со временем работы ≥ 100 часов, сортируйте по убыванию часов.
  5. Сформируйте отчёт с общими итогами, длинноработающими узлами и номерами ошибок; при отсутствии online-узлов среднее и максимум обозначьте как «нет данных».
  6. Проверьте файл только с offline, отрицательное время и неизвестный статус.
  7. Добавьте поиск узлов по порогу времени работы: пользователь задаёт неотрицательное число часов, программа выводит все online-узлы с временем не меньше порога, отсортированные по убыванию времени.

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

📄 Содержимое файла availability.txt — раскрыть и скопировать
availability.txt
srv01;120;online
srv02;0;offline
db01;240;online
backup01;180;online
router01;48;online
srv03;0;offline
srv04;90;online
srv05;-2;online
srv06;100;unknown
db02;360;online
srv07;0;offline
srv08;24;online

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


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

Section titled “Требования к результату”
  1. Создайте рабочую папку своего варианта, входной файл из условия и main.py.
  2. Реализуйте не менее пяти пользовательских функций (не считая вложенные выражения и вызовы стандартных функций). Обязательны: разбор записи, чтение/проверка файла, расчёт показателей, выборка по условию, формирование отчёта; main() рекомендуется дополнительно.
  3. Каждая функция должна выполнять преимущественно одну задачу. Передавайте данные параметрами, избегайте глобальных переменных.
  4. Программа должна корректно обработать пустые строки, ошибки формата и недопустимые значения, указанные для вашего варианта: не завершаться аварийно, а пропускать плохую запись и учитывать её в отчёте.
  5. Входной файл не изменять. Сохранить итог в отдельный файл, указанный в варианте, и вывести краткую сводку на экран.
  6. Для текстовых файлов использовать with open(..., encoding="utf-8"); обрабатывать отсутствие входного файла (FileNotFoundError).
  7. Отсортировать итоговую выборку по правилу своего варианта; при одинаковых значениях использовать указанное вторичное правило либо сортировку по имени/коду.

Минимальная структура сдаваемой работы

practice_07/
├── main.py
├── input.txt # название из вашего варианта
├── report.txt # название из вашего варианта, создаёт программа
└── test_cases.txt # три сценария проверки и ожидаемые результаты

Названия input.txt и report.txt в схеме условные. Используйте точные имена файлов из задания.

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

  1. Для чего программе декомпозиция на функции?
  2. В чём разница между аргументом и параметром?
  3. Чем отличается return от print()?
  4. Как функция возвращает два результата?
  5. Почему удобнее передавать список/словарь параметром, чем использовать глобальную переменную?
  6. Как организовать отдельную проверку формата строки?
  7. Что означает «чистая функция»? Почему её легче тестировать?
  8. Для чего нужна функция main()?
  9. Как обработать файл, которого нет?
  10. Почему для пустого набора нужно отдельно обрабатывать среднее значение?
  11. Как проверить граничное значение порога?
  12. Зачем сохранять номера некорректных строк?
  13. Как проверить, что сортировка выполнена по двум критериям?
  14. В чём разница между тестированием одной функции и всей программы?
  15. Почему полезно разделять вычисления и построение текста отчёта?

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

Section titled “Рекомендуемая литература”
  1. Официальная документация Python: определение функций.
  2. Официальная документация Python: ошибки и исключения.
  3. Официальная документация Python: работа с файлами.
  4. Официальная документация Python: структуры данных.