6. tēma: Datu pastāvība un Analīze. 4. stunda: Rezultātu tabulas.

Tavs šīs stundas izaicinājums: Izveidot "Slavas zāli", kas atceras visus spēlētājus. Tu iemācīsies Read-Modify-Write ciklu: nolasīt esošos rezultātus no JSON faila, pievienot jaunu ierakstu, sakārtot tos pēc punktiem un saglabāt TOP 5 labākos rezultātus.

SR 2.4.14. (Datu struktūru kārtošana un JSON)

Teorija: JSON apstrādes cikls

JSON faili nav kā parasts teksta dokuments, kuram var vienkārši "pierakstīt klāt" rindas beigās. Tie ir vienoti datu objekti (parasti liels saraksts ar vārdnīcām). Lai tos pareizi papildinātu, jāievēro trīs soļi:

  1. LASĪT (Read): Ielādē visu faila saturu Python sarakstā. Ja fails neeksistē (pirmā spēles reize), izveido tukšu sarakstu [].
  2. MAINĪT (Modify): Pievieno sarakstam jaunā spēlētāja datus (kā vārdnīcu) un sakārto to.
  3. RAKSTĪT (Write): Pārraksti visu failu ar jauno, papildināto sarakstu, izmantojot "w" režīmu.

Kārtošana ar Lambda

Kad sarakstā atrodas vārdnīcas, Python nezina, pēc kura "stabiņa" (atslēgas) veikt kārtošanu. Mums ir jādod instrukcija:

$$key=lambda\ x:\ x['punkti']$$

Tas pasaka: "Apskati katru elementu (x) un kārtošanai izmanto tā vērtību pie atslēgas 'punkti'."

Praktiskie uzdevumi

1. uzdevums: Pirmais ieraksts

  1. VS Code izveido failu rezultati.py un importē json.
  2. Izveido tukšu sarakstu visi_rezultati = [].
  3. Pajautā lietotājam vārdu un punktu skaitu.
  4. Izveido vārdnīcu dati = {"vards": vards, "punkti": int(punkti)} (svarīgi: punkti ir jākonvertē uz skaitli!).
  5. Pievieno šo vārdnīcu sarakstam un saglabā to failā leaderboard.json.

2. uzdevums: Hall of Fame papildinātājs (Read & Write)

Iemācīties nolasīt esošos rezultātus, pirms pievienot jaunu, lai dati netiktu pārrakstīti.

  1. Pirms jauna rezultāta prasīšanas, mēģini atvērt un nolasīt leaderboard.json ar json.load().
  2. Ieliec nolasīšanu try...except FileNotFoundError: blokā. Ja fails neeksistē, definē visi_rezultati = [].
  3. Pēc nolasīšanas pievieno jauno rezultātu (no 1. uzdevuma) un saglabā visu sarakstu atpakaļ failā.
  4. Palaid programmu 3 reizes ar dažādiem vārdiem un pārbaudi JSON failu — tajā vajadzētu būt 3 ierakstiem.

3. uzdevums: TOP 5 kārtošanas sistēma

Iemācīties sakārtot sarakstu un saglabāt tikai labākos rezultātus.

  1. Pirms saraksta saglabāšanas failā, sakārto to no lielākā uz mazāko:
    visi_rezultati.sort(key=lambda x: x['punkti'], reverse=True)
  2. Izmanto slicing (nogriešanu), lai saglabātu tikai pirmos piecus: top_5 = visi_rezultati[:5].
  3. Izveido funkciju paradit_top(), kas ar for ciklu izvada rezultātus glītā, numurētā sarakstā.

Biežākās kļūdas:

1. Datu pārrakstīšana: Ja Tu aizmirsti vispirms nolasīt esošos datus (1. solis), katrs jauns spēlētājs izdzēsīs visus iepriekšējos, atstājot failā tikai vienu ierakstu.
2. Kārtošana kā tekstam: Ja punktus saglabāsi kā tekstu (piem., "9"), kārtojot tas tiks uzskatīts par "lielāku" nekā "100" (jo 9 ir lielāks par 1 alfabētā). Vienmēr lieto int()!
3. Neērti lasāms JSON: Saglabājot failu, vienmēr lieto json.dump(dati, f, indent=4), lai fails būtu strukturēts un viegli pārbaudāms.

Koda paraugs: Pilns Read-Modify-Write cikls

import json

# 1. Mēģinām nolasīt datus
try:
    with open("scores.json", "r", encoding="utf-8") as f:
        top_saraksts = json.load(f)
except FileNotFoundError:
    top_saraksts = [] # Ja faila nav, sākam ar tukšu lapu

# 2. Pievienojam jaunu rezultātu
jauns = {"vards": "Drosmīgais", "punkti": 150}
top_saraksts.append(jauns)

# 3. Sakārtojam un atstājam tikai TOP 5
top_saraksts.sort(key=lambda x: x['punkti'], reverse=True)
top_saraksts = top_saraksts[:5]

# Saglabājam atpakaļ failā
with open("scores.json", "w", encoding="utf-8") as f:
    json.dump(top_saraksts, f, indent=4)
Dati sakārtoti un saglabāti!
TOP 1: Drosmīgais (150 punkti)
⬅ Iepriekšējā stunda Nākamā stunda ➡