Тем временем чем занят владелец:
"import csv
import os
from collections import defaultdict
# ---------- НАСТРОЙКИ ----------
PLACES = {
'Информационная безопасность телекоммуникационных систем': 58,
'Инфокоммуникационные технологии и системы связи': 150,
'Фундаментальная информатика и информационные технологии': 40,
'Информационные системы и технологии': 45,
'Информатика и вычислительная техника': 205,
}
FILES = {
'Информационная безопасность телекоммуникационных систем': 'Информационная_безопасность телекоммуникационных систем.2026-07-22_17-15-08 (1).txt',
'Инфокоммуникационные технологии и системы связи': 'Инфокоммуникационные_технологии и системы связи.2026-07-22_17-15-26.txt',
'Фундаментальная информатика и информационные технологии': 'Фундаментальная_информатика и информационные технологии.2026-07-22_17-17-16.txt',
'Информационные системы и технологии': 'Информационные_системы и технологии.2026-07-22_17-16-02.txt',
'Информатика и вычислительная техника': 'Информатика_и вычислительная техника.2026-07-22_17-16-44.txt',
}
DOWNLOAD_DIR = os.path.expanduser("~/storage/downloads")
# ---------- ФУНКЦИИ ----------
def read_csv_safe(filepath):
"""Чтение файла с автоматическим перебором кодировок."""
for enc in ('utf-8', 'windows-1251', 'cp1251'):
try:
with open(filepath, 'r', encoding=enc) as f:
reader = csv.DictReader(f, delimiter=';')
return list(reader)
except UnicodeDecodeError:
continue
raise ValueError(f"Не удалось подобрать кодировку для {filepath}")
# ---------- ЗАГРУЗКА И ФИЛЬТРАЦИЯ ----------
applications = []
print("⏳ Загрузка данных...")
for direction, filename in FILES.items():
filepath = os.path.join(DOWNLOAD_DIR, filename)
if not os.path.exists(filepath):
print(f"⚠️ Файл не найден: {filepath}")
continue
try:
rows = read_csv_safe(filepath)
for row in rows:
if row.get('Подано согласие', '') not in ('Электронное', 'Бумажное'):
continue
status = row.get('Статус', '')
if status not in ('Участвуете в конкурсе', 'Передано в вуз'):
continue
code = row.get('Код поступающего', '').strip()
score_str = row.get('Сумма баллов', '').strip()
if not code or not score_str:
continue
try:
priority = int(row.get('Приоритет конкурса', 0))
score = int(score_str)
except ValueError:
continue
if score <= 0:
continue
applications.append({
'code': code,
'score': score,
'direction': direction,
'priority': priority,
'status': status
})
except Exception as e:
print(f"❌ Ошибка при чтении {filename}: {e}")
print(f"✅ Успешно загружено {len(applications)} заявлений от абитуриентов с оригиналами.")
# ---------- ГРУППИРОВКА И РАНЖИРОВАНИЕ ----------
students = defaultdict(list)
for app in applications:
students[app['code']].append(app)
aggregated = []
for code, apps in students.items():
# Сортируем заявки абитуриента по приоритету (1 - самый высокий)
apps_sorted = sorted(apps, key=lambda x: x['priority'])
# Берем максимальный балл среди всех направлений (в случае разного учета ИД)
max_score = max(a['score'] for a in apps)
aggregated.append({
'code': code,
'score': max_score,
'applications': apps_sorted
})
# Сортировка по баллам (по убыванию).
aggregated.sort(key=lambda x: x['score'], reverse=True)
# ---------- МОДЕЛИРОВАНИЕ ЗАЧИСЛЕНИЯ ----------
places_remaining = PLACES.copy()
enrolled = {}
direction_scores = {d: [] for d in PLACES}
enrolled_details = {d: [] for d in PLACES}
print("\n🔄 Выполнение сквозного распределения...")