"""Snittfart for en liste med økter. Rettet utgave av snitt.py. Hører til gribben.no/tech/losninger/feilsok-med-ai.html. Kjør: python snitt_rettet.py okter.csv Rettelsen er tegnkodingen i les(). Se feilsøkingssida for hvordan den ble funnet: fem hypoteser, fire strøket, én bekreftet med de rå bytene. les() sier også fra, i stedet for å krasje, hvis fila ikke er UTF-8 eller er delt med semikolon. Det er det du ofte får når norsk Excel lagrer som vanlig CSV og ikke som «CSV UTF-8». """ import csv import sys def les(sti): # Filer fra Excel eller Notisblokk kan starte med et usynlig BOM-merke. Med # «utf-8-sig» fjernes det, ellers blir første kolonne hetende '\ufeffdato' og ikke 'dato'. try: with open(sti, encoding="utf-8-sig", newline="") as f: leser = csv.DictReader(f) rader = list(leser) except UnicodeDecodeError: sys.exit(f"{sti} er ikke UTF-8, trolig lagret fra Excel som vanlig CSV. " "Lagre den som «CSV UTF-8» og prøv igjen.") if leser.fieldnames and len(leser.fieldnames) == 1 and ";" in leser.fieldnames[0]: sys.exit(f"{sti} er delt med semikolon, ikke komma. Lagre som «CSV UTF-8», " "eller bytt til csv.DictReader(f, delimiter=';').") return rader def sekunder(tid): minutter, sek = tid.split(":") return int(minutter) * 60 + int(sek) def snittfart(rader): totalt = sum(sekunder(r["tid"]) for r in rader) km = sum(float(r["km"]) for r in rader) per_km = round(totalt / km) return f"{per_km // 60}:{per_km % 60:02d}" def main(): rader = les(sys.argv[1]) rader.sort(key=lambda r: r["dato"]) print(f"{len(rader)} økter fra {rader[0]['dato']} til {rader[-1]['dato']}") print(f"Snittfart: {snittfart(rader)} per km") if __name__ == "__main__": sys.stdout.reconfigure(encoding="utf-8") sys.stderr.reconfigure(encoding="utf-8") main()