Potok telemetrii
Tu wszystkie elementy się łączą: czytnik CSV z „Telemetrii z CSV”, obsługa błędów z „Przetrwaj złe linie”, limity ze sprawdzania alarmów i JSON z „JSON na wyjściu”. Eksport ze stacji naziemnej przychodzi co kilka sekund. Twój program ma go odczytać, odrzucić to, czemu nie można ufać, podnieść alarm przy tym, co wychodzi poza zakres, i zostawić podsumowanie, które panel umie odczytać.
Trzy etapy: sprawdź, oznacz, zapisz.
Ukończ etap 1, aby odblokować ten etap.
Czytaj telemetry.csv przez csv.DictReader. Odrzuć wiersz, którego czujnika nie ma w LIMITS albo którego wartość nie jest liczbą, z jego numerem linii w pliku: nagłówek to linia 1, więc pierwszy odczyt to linia 2. Każdy inny wiersz zachowaj w readings, jako słownik z time ("HH:MM:SS"), sensor i value (float). Program wypisze:
Odrzucona linia 5: wartość ERR nie jest liczbą Odrzucona linia 8: nieznany czujnik ENG-9 Poprawne: 7, odrzucone: 2
enumerate(csv.DictReader(csv_file), start=2) numeruje wiersze tak, jak robi to plik. Najpierw sprawdź czujnik, potem spróbuj zamiany.
Ukończ etap 1, aby odblokować ten etap.
Po liczbach sprawdź każdy poprawny odczyt z zakresem jego czujnika w LIMITS. Zbierz każdy spoza zakresu w alerts, jako słownik z time, sensor, value, side ("powyżej" albo "poniżej") i przekroczonym limit, a potem wypisz je i ich liczbę:
ALERT 09:30:15 ENG-1 455.2 powyżej 450.0 ALERT 09:30:15 TANK-1 9.4 poniżej 10.0 ALERT 09:30:20 CABIN 94.1 poniżej 95.0 Alarmy: 3
low, high = LIMITS[reading["sensor"]] rozpakowuje zakres.
Ukończ etap 2, aby odblokować ten etap.
Zapisz podsumowanie dla panelu do summary.json: słownik z valid (liczbą odczytów), rejected i listą alerts, zapisany przez json.dump(), z indent=2 i ensure_ascii=False. Potem wypisz ostatnią linię:
Zapisano summary.json
Ukryte testy otwierają summary.json i porównują go z tym, czego oczekują.
Podpowiedzi
Import modułów systemowych
# Moduł to skrzynka z narzędziami, którą ktoś już zbudował i przetestował za Ciebie
# Zwykły import wczytuje cały moduł
import sys
import platform
import math
# from ... import wczytuje tylko jedno narzędzie
from math import sqrt
# as nadaje modułowi krótszy przydomek
import random as rng
# Przy zwykłym imporcie: nazwa modułu, kropka, potem narzędzie
print("Wersja Pythona:", platform.python_version())
print("System:", platform.system())
print("Python mieszka w:", sys.executable)
# math zawiera stałe, których nie chciałbyś wpisywać z pamięci
radius_km = 6371
print("Obwód Ziemi:", round(2 * math.pi * radius_km), "km")
# sqrt przyszło samo, więc nie potrzebuje kropki przed sobą
print("Pierwiastek kwadratowy z 9:", sqrt(9))
# rng to po prostu przydomek dla random
print("Losowy dzień roku marsjańskiego:", rng.randint(1, 687))
Oddziel argumenty przecinkami. Każde uruchomienie przekazuje je jako sys.argv[1:].