6. tēma: Datu pastāvība un Analīze. 3. stunda: Datu transformācija.

Tavs šīs stundas izaicinājums: Pārvērst vienkāršu sarakstu par "viedo karti". Kad mēs ielādējam datus no CSV, tie bieži ir "netīri" (ar liekām atstarpēm vai tikai teksta formātā). Tu iemācīsies notīrīt datus un transformēt tos, izveidojot vārdnīcu, kurā lokācijas ID nodrošina acumirklīgu piekļuvi visai istabas informācijai.

SR 2.4.14. (Datu apstrāde un validācija)

Teorija: No Saraksta uz Vārdnīcu

Kad mēs nolasām CSV ar csv.DictReader, mēs iegūstam rindu sarakstu. Lai tajā atrastu 50. lokāciju, datoram ir jāpārskata 49 iepriekšējās. Transformējot datus lielā vārdnīcā, mēs iegūstam tūlītēju piekļuvi pēc atslēgas (ID).

Metode / Funkcija Ko tā dara? Kāpēc tas ir svarīgi CSV apstrādē?
.strip() Noņem tukšās atstarpes no teksta sākuma un beigām. Izlabo Excel eksporta kļūdas (piem., " 1 " kļūst par "1").
int(teksts) Pārvērš tekstu par veselu skaitli. CSV visi dati ir teksts (str). Mums ID vajag kā skaitļus.
if atslēga in dict: Pārbauda, vai konkrētā atslēga eksistē vārdnīcā. Novērš programmas avarēšanu, ja spēlētājs izvēlas neesošu vietu.

Praktiskie uzdevumi

1. uzdevums: Pasaules kartes konstruktors

  1. Izmanto iepriekšējā stundā izveidoto nolasīšanas kodu failā tests.py.
  2. Pirms faila atvēršanas izveido tukšu vārdnīcu pasaules_karte = {}.
  3. CSV lasīšanas ciklā izveido jaunu mainīgo: id_numurs = int(rinda['id'].strip()).
  4. Pievieno visu rindu lielajai vārdnīcai: pasaules_karte[id_numurs] = rinda.
  5. Ārpus (pēc) with open() bloka pārbaudi rezultātu: print(pasaules_karte[1]) – tam būtu jāizvada visa informācija par 1. lokāciju.

2. uzdevums: Mērķu (Saites) validācija

Spēles failos mēdz būt "tukšumi" (piemēram, beigu lokācijām nav nākamā mērķa). Mums tie jāapstrādā droši.

  1. Koda failā atrodi vietu, kur transformē ID numurus.
  2. Pievieno pārbaudes loģiku merkis_a un merkis_b kolonnām:
    "Ja rinda['merkis_a'] nav tukšs (!= ""), tad pārvērt to par int(), citādi atstāj kā None".
  3. Izdari to pašu mērķim B. Tagad Tava karte ir droša pret tukšām Excel šūnām.

3. uzdevums: Kartes auditors (Kļūdu meklētājs)

Izveidosim algoritmu, kas automātiski pārbauda, vai Tavā stāstā nav "mirušo saišu" (norādes uz neeksistējošām vietām).

  1. Pašās faila beigās uzraksti for ciklu, kas pārlūko Tavu jaunizveidoto pasaules_karte vārdnīcu (izmanto .values()).
  2. Katrai lokācijai pārbaudi: "Vai mērķis A eksistē un vai tas ir atrodams kartes atslēgās?" (if rinda['merkis_a'] and rinda['merkis_a'] not in pasaules_karte:).
  3. Ja atrod kļūdu, izvadi brīdinājumu: f"Kļūda lokācijā {rinda['id']}: mērķis {rinda['merkis_a']} nav atrasts!".
  4. Ieraksti savā CSV failā kļūdainu ID, saglabā to un pārbaudi, vai Tavs auditors strādā.

Biežākās kļūdas datu tīrīšanā:

1. Reģistrjutība: Python atšķir 'id' no 'ID'. Pārliecinies, ka koda atslēgas precīzi sakrīt ar CSV galvenēm!
2. ValueError konvertējot tukšumu: Tu nevari izdarīt int(""). Vienmēr pārbaudi (if rinda['merkis'] != "":), pirms mēģini tekstu pārvērst par skaitli.
3. Lokālo mainīgo pazušana: Ja pasaules_karte = {} definēsi iekšpusē with open() blokam vai ciklā, tai būs grūti piekļūt no ārpuses vai tā pārrakstīsies katru reizi no jauna.

Koda paraugs: Viedā karte

import csv

pasaules_karte = {}

with open('pasaule.csv', mode='r', encoding='utf-8') as f:
    lasitajs = csv.DictReader(f)
    
    for rinda in lasitajs:
        # Notīrām un konvertējam galveno ID
        id_skaitlis = int(rinda['id'].strip())
        
        # Pievienojam rindu vārdnīcai
        pasaules_karte[id_skaitlis] = rinda

# Tagad piekļuve jebkurai istabai ir acumirklīga:
# Izprintēsim 2. lokācijas nosaukumu un tekstu
istaba = pasaules_karte[2]
print(f"Tu atrodies: {istaba['nosaukums']}")
print(istaba['teksts'])
Transformācija pabeigta!
Tu atrodies: Vecais mežs
Koki šeit aug tik cieši...
⬅ Iepriekšējā stunda Nākamā stunda ➡