ebSkola

6.1 Failu I/O

Stundas uzdevums: Piešķirt savai programmai "bezmirstību". Apgūsi, kā izmantot Failu I/O (Input/Output), lai saglabātu informāciju (piemēram, spēles progresu vai rezultātu tabulas) cietajā diskā. Apskatīsim trīs galvenos formātus: TXT, JSON un CSV.

SR 2.4.14. (Failu lasīšana un rakstīšana)

70 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~15 min) - ieraksti un nolasi teksta failu · 2. uzdevums (~25 min) - salīdzini režīmus w un a · 3. uzdevums (~20 min) - saglabā spēles datus JSON formātā. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.

Pirms sāc: atver VS Code projekta mapē un izveido failu faili.py. Uzmanies ar režīmu "w" - tas dzēš visu faila saturu bez brīdinājuma.

Teorija: Failu apstrādes režīmi

Atverot failu, mums ir jāpasaka Python, ko mēs plānojam darīt. Katram režīmam ir sava loma un riski.

Režīms Nosaukums Ko tas dara? Bīstamība
"r" Read Atver failu tikai lasīšanai. Izmetīs kļūdu, ja fails neeksistē.
"w" Write Izveido jaunu failu vai pārraksta esošo. Viss iepriekšējais saturs tiks neatgriezeniski izdzēsts!
"a" Append Pieraksta jaunus datus faila beigās. Drošs - saglabā esošo saturu.

Kāpēc lietot "with open()"?

Šī konstrukcija nodrošina, ka fails tiek automātiski aizvērts, tiklīdz beidzas ar atkāpi rakstītais koda bloks (pat tad, ja programmā rodas kļūda). Tas novērš failu korupciju.

Praktiskie uzdevumi

1. uzdevums -

Ieraksti un nolasi teksta failu

Beigās tava programma izveidos failu un pēc tam to nolasīs.

  1. Ieraksti with open("dati.txt", "w", encoding="utf-8") as f:.
  2. Ieraksti zem tā ar atkāpi f.write("Pirmā rinda\n").
  3. Palaid un pārbaudi, vai mapē parādījās dati.txt.
  4. Atver failu VS Code un izlasi tā saturu.
  5. Pievieno kodam with open("dati.txt", "r", encoding="utf-8") as f: un izdrukā f.read().
  6. Palaid un salīdzini terminālī redzamo ar faila saturu.

Gatavs, kad: mapē ir fails dati.txt, un terminālī izdrukājas tieši tas pats teksts.

2. uzdevums -

Salīdzini režīmus w un a

Beigās tu zināsi, kurš režīms dzēš tavus datus.

  1. Palaid savu rakstīšanas kodu vēl divas reizes.
  2. Atver dati.txt un saskaiti rindas.
  3. Nomaini režīmu no "w" uz "a".
  4. Palaid vēl divas reizes un saskaiti rindas vēlreiz.
  5. Pieraksti, kurā gadījumā rindas krājās un kurā ne.
  6. Mēģini atvērt neesošu failu režīmā "r" un pieraksti kļūdas nosaukumu.

Gatavs, kad: ar "w" failā vienmēr paliek viena rinda, ar "a" to skaits aug, bet "r" uz neesoša faila dod FileNotFoundError.

3. uzdevums -

Saglabā spēles datus JSON formātā

Beigās vesela vārdnīca tiks saglabāta un atkal ielādēta.

  1. Ieraksti pirmajā rindā import json.
  2. Izveido vārdnīcu ar atslēgām vards, punkti un sarakstu materiali.
  3. Saglabā to ar json.dump(dati, f, indent=4) failā save.json.
  4. Atver save.json VS Code un apskati, kā tas izskatās.
  5. Nolasi failu atpakaļ ar ielade = json.load(f).
  6. Izdrukā ielade["punkti"].
  7. Pieraksti vienu secinājumu: ko dara indent=4.

Gatavs, kad: save.json ir salasāms ar atkāpēm, un ielādētie punkti sakrīt ar sākotnējiem.

Papildu uzdevums - Nolasi failu pa rindām

Ja pamatdarbs ir gatavs, apstrādā katru rindu atsevišķi.

  1. Ieraksti failā piecas rindas ar režīmu "a".
  2. Nolasi failu ar for rinda in f: ciklu.
  3. Izdrukā katru rindu ar print(rinda.strip()).
  4. Pieraksti, ko mainīja .strip().
  5. Saskaiti ciklā rindu skaitu un izdrukā to.

Gatavs, kad: izvadē nav lieku tukšu rindu, un izdrukātais rindu skaits sakrīt ar faila saturu.

Biežākās kļūdas:

1. encoding="utf-8" trūkums: Neaizmirsti šo parametru open() funkcijā, citādi latviešu burti (ā, č, ē) failā pārvērtīsies par "ķeburiem".
2. Write vs Append (w pret a): Atceries, ka "w" izdzēsīs visu Tavu faila vēsturi! Ja gribi tikai pievienot jaunu rindiņu, izmanto "a".
3. Aizmirsts import: Tu nevari izmantot json.dump() vai csv.writer(), ja faila pirmajā rindā nav veikts attiecīgais imports.

Koda piemērs

import json

dati = {"vards": "Anna", "punkti": 100, "materiali": ["marķieris"]}

# Datu saglabāšana diskā
with open("save.json", "w", encoding="utf-8") as f:
    # indent=4 padara failu viegli lasāmu cilvēkiem
    json.dump(dati, f, indent=4)
    print("Rezultāts saglabāts!")

# Datu nolasīšana (ielādēšana)
with open("save.json", "r", encoding="utf-8") as f:
    ieladetie_dati = json.load(f)

print(f"Ielādēts profils: {ieladetie_dati['vards']}")
Rezultāts saglabāts!
Ielādēts profils: Anna