/
sarus
/
photo-processor
Обзор
Документация
Войти
/
sarus
/
photo-processor
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/photo_processor/reporting.py
105 строк
3 KB
otcheskiy
feat: add simple background segmentation and mask quality
01 авг 2026, 12:34
01 авг 2026, 12:34
03c5abe
Код
Авторство
О чём код?
"""Формирование CSV-отчёта processing_report.csv.""" from __future__ import annotations import csv from dataclasses import asdict, dataclass, fields from datetime import datetime from pathlib import Path CSV_DELIMITER = ";" CSV_ENCODING = "utf-8-sig" CSV_FIELDS = [ "timestamp", "source_file", "output_file", "status", "original_width", "original_height", "cropped_width", "cropped_height", "background_r", "background_g", "background_b", "background_brightness", "background_std", "raw_foreground_ratio", "clean_foreground_ratio", "foreground_retention_ratio", "foreground_loss_ratio", "removed_foreground_pixels", "removed_component_count", "component_count", "significant_component_count", "border_component_count", "object_x", "object_y", "object_width", "object_height", "object_area_ratio", "mask_method", "mask_quality_score", "warning", "error", "processing_time_ms", ] @dataclass(frozen=True) class ReportRow: timestamp: str source_file: str output_file: str status: str original_width: str original_height: str cropped_width: str cropped_height: str background_r: str = "" background_g: str = "" background_b: str = "" background_brightness: str = "" background_std: str = "" raw_foreground_ratio: str = "" clean_foreground_ratio: str = "" foreground_retention_ratio: str = "" foreground_loss_ratio: str = "" removed_foreground_pixels: str = "" removed_component_count: str = "" component_count: str = "" significant_component_count: str = "" border_component_count: str = "" object_x: str = "" object_y: str = "" object_width: str = "" object_height: str = "" object_area_ratio: str = "" mask_method: str = "" mask_quality_score: str = "" warning: str = "" error: str = "" processing_time_ms: int = 0 def as_dict(self) -> dict[str, str | int]: data = asdict(self) return {field.name: data[field.name] for field in fields(self)} def format_timestamp(moment: datetime | None = None) -> str: value = moment or datetime.now() return value.strftime("%Y-%m-%d %H:%M:%S") def write_report(path: Path, rows: list[ReportRow]) -> None: """Записать отчёт в UTF-8 with BOM с разделителем ';'.""" with path.open("w", encoding=CSV_ENCODING, newline="") as handle: writer = csv.DictWriter( handle, fieldnames=CSV_FIELDS, delimiter=CSV_DELIMITER, quoting=csv.QUOTE_MINIMAL, ) writer.writeheader() for row in rows: writer.writerow(row.as_dict())