›_ebskola.lv
Prog I · 6. tēma · 6 stundas - Python · CSV · JSON · faili

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 CSV · JSON · open() Quiz + Highscore
# 01 stundu plāns

6 stundas - faili, CSV, JSON un analīze

noslēguma projekts →
fails.txt with open("f") as f: f.read() "r" lasīt · "w" rakstīt · "a" pievienot // open() + with
Python · failiI/O

Failu lasīšana un rakstīšana

open() režīmi ("r"/"w"/"a"), with konteksta pārvaldnieks, teksta rindas, UTF-8.

6.1 stundaatvērt ↗
Google Sheets → CSV vārds punkti datums Anna 85 Jānis 92 Eksportēt CSV // Google Sheets
Google Sheetsdigitālie rīki

Digitālais rīks: Google Sheets

Datu vākšana Sheets, eksportēšana CSV, ielāde Python ar csv.reader(), datu apstrāde.

6.2 stundaatvērt ↗
Neapstrādāti Anna, 85 , 92 Jānis,, filter() strip() sorted() Tīri dati Anna 85 Jānis 92 // filter + sorted
Python · filtertransformācija

Datu tīrīšana un transformācija

strip(), filter(), sorted(key=lambda), None vērtību apstrāde.

6.3 stundaatvērt ↗
TOP 5 Highscore 🥇Anna95 🥈Pēteris88 🥉Marta82 Jānis75 sorted(dati, key=lambda x: x[1], reverse=True) // highscore.csv
CSV · sortedpastāvība

Rezultātu tabulas un datu pastāvība

Highscore CSV tabula, sorted(key=lambda), TOP-N filtrēšana, CSV append un pārlasīšana.

6.4 stundaatvērt ↗
Skoru vizualizācija Anna 95 Pēteris 88 Marta 82 Jānis 75 '█' * (punkti // 5) // ASCII bar chart
vizualizācijaanalīze

Datu vizualizācija un analīze

ASCII bāras diagramma terminālī, min()/max()/sum(), vidējā vērtība, matplotlib intro.

6.5 stundaatvērt ↗
$ python quiz.py
Python · JSON · CSVprojekts

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.6 projektsatvērt ↗
# 02 špikeris

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.

$ python quiz.py # JSON jautājumi + CSV highscore # with open(...) garantē, ka fails vienmēr tiks aizvērts