Datu pastāvība //
un analīze
Saglabā un nolasi datus failos starp programmām. Apgūsti CSV un JSON - pamatu jebkurai datu lietotnei.
6 stundas - faili, CSV, JSON un analīze
Failu lasīšana un rakstīšana
open() režīmi ("r"/"w"/"a"), with konteksta pārvaldnieks, teksta rindas, UTF-8.
Digitālais rīks: Google Sheets
Datu vākšana Sheets, eksportēšana CSV, ielāde Python ar csv.reader(), datu apstrāde.
Datu tīrīšana un transformācija
strip(), filter(), sorted(key=lambda), None vērtību apstrāde.
Rezultātu tabulas un datu pastāvība
Highscore CSV tabula, sorted(key=lambda), TOP-N filtrēšana, CSV append un pārlasīšana.
Datu vizualizācija un analīze
ASCII bāras diagramma terminālī, min()/max()/sum(), vidējā vērtība, matplotlib intro.
Noslēguma projekts: Quiz spēle ar Highscore
Jautājumi no JSON faila, atbildes validācija, rezultāta saglabāšana CSV, TOP-5 highscore.
6. tēmas špikeris - faili un dati
Failu I/O, CSV, JSON, datu transformācija un vizualizācija. Katrs bloks atbilst vienai stundai.
6.1 Failu režīmi un JSON
# Režīmi - "w" ir BĪSTAMS
open("dati.txt", "r") # lasa; ja faila nav -> FileNotFoundError
open("dati.txt", "w") # raksta; IZDZĒŠ visu veco saturu bez brīdinājuma!
open("dati.txt", "a") # pieraksta beigās; drošs
# with aizver failu pats, arī ja rodas kļūda
with open("dati.txt", "a", encoding="utf-8") as f:
f.write("Jauna rinda\n") # \n = jauna rinda
with open("dati.txt", "r", encoding="utf-8") as f:
for rinda in f:
print(rinda.strip()) # .strip() noņem \n
# JSON - vesela struktūra vienā failā
import json
dati = {"vards": "Anna", "punkti": 100, "materiali": ["marķieris"]}
with open("save.json", "w", encoding="utf-8") as f:
json.dump(dati, f, indent=4) # indent=4 -> salasāmi
with open("save.json", "r", encoding="utf-8") as f:
ielade = json.load(f)
encoding="utf-8" raksti vienmēr - bez tā garumzīmes failā var pārvērsties par simbolu putru.
6.2-6.3 CSV lasīšana un transformācija
import csv
# DictReader pārvērš katru rindu par vārdnīcu,
# kur atslēgas ir tabulas PIRMĀ rinda (galvenes)
with open('pasaule.csv', mode='r', encoding='utf-8') as f:
lasitajs = csv.DictReader(f)
for rinda in lasitajs:
print(rinda['id'], rinda['teksts'])
# Dati no izklājlapas ir netīri - jātīra
id_skaitlis = int(rinda['id'].strip()) # " 2 " -> 2
# .strip() noņem liekās atstarpes
# int() teksts -> skaitlis
# Saraksts -> vārdnīca pēc id = tūlītēja piekļuve
pasaules_karte = {}
for rinda in lasitajs:
pasaules_karte[int(rinda['id'].strip())] = rinda
pasaules_karte[2]['teksts'] # uzreiz, bez cikla
# Bojāta rinda nedrīkst apturēt visu ielādi
try:
id_skaitlis = int(rinda['id'].strip())
except ValueError:
print("Izlaižu bojātu rindu:", rinda)
continue
Saraksts prasa pārmeklēt visas rindas. Vārdnīca pēc id atrod ierakstu uzreiz.
6.4 JSON lasīt-mainīt-rakstīt cikls
import json
# 1. LASĪT (ar trūkstoša faila apstrādi)
try:
with open("scores.json", "r", encoding="utf-8") as f:
top = json.load(f)
except FileNotFoundError:
top = [] # pirmā reize - sākam ar tukšu sarakstu
# 2. MAINĪT
top.append({"vards": "Anna", "punkti": 120})
# 3. RAKSTĪT - vienmēr VISU sarakstu, režīmā "w"
with open("scores.json", "w", encoding="utf-8") as f:
json.dump(top, f, indent=4)
# JSON failam nedrīkst "pierakstīt klāt" ar "a" - tas sabojātu formātu.
# Kārtošana pēc lauka
top.sort(key=lambda x: x["punkti"], reverse=True)
for i, ieraksts in enumerate(top[:5], 1): # TOP 5
print(f"{i}. {ieraksts['vards']} - {ieraksts['punkti']}")
top[:5] ar trim ierakstiem atgriež trīs - kļūdu tas nerada.
6.5 Agregācija un teksta diagramma
statistika = {"Mežs": 15, "Ala": 8, "Pils": 3}
kopa = 0
for skaitlis in statistika.values():
kopa += skaitlis
videjais = kopa / len(statistika)
print(f"Vidēji {videjais:.1f}")
# Stabiņu diagramma no simboliem
print("--- LOKĀCIJU POPULARITĀTE ---")
for vieta, skaits in statistika.items():
stabins = "#" * skaits # simbolu var reizināt!
print(f"{vieta:10} {stabins} {skaits}")
# {vieta:10} = teksts 10 zīmju platumā -> stabiņi sākas vienā līnijā
# Sakārtots pēc lieluma
for vieta, skaits in sorted(statistika.items(),
key=lambda x: x[1], reverse=True):
print(f"{vieta:10} {'#' * skaits}")
Secinājumam jābalstās uz skaitli: "Mežs ir 15 no 26 gadījumiem, tas ir 58%", nevis "Mežs šķiet populārs".
6.6 Noslēguma projekts: dati ārpus koda
import json, random
def ielade_jautajumus(fails="jautajumi.json"):
with open(fails, "r", encoding="utf-8") as f:
return json.load(f)
jautajumi = ielade_jautajumus()
vards = input("Tavs vārds: ")
punkti = 0
for j in random.sample(jautajumi, 5): # 5 nejauši, bez atkārtošanās
print(j["teksts"])
for i, v in enumerate(j["varianti"], 1):
print(f" {i}. {v}")
atbilde = int(input("Atbilde: ")) - 1
if atbilde == j["pareizais"]:
punkti += 1
# Rezultāts CSV failā, režīmā "a" - vecie rezultāti paliek
with open("highscore.csv", "a", encoding="utf-8") as f:
f.write(f"{vards},{punkti}\n")
Jautājumi dzīvo jautajumi.json failā - lai pievienotu jaunu, kods nav jāmaina.