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.
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.
- Ieraksti
with open("dati.txt", "w", encoding="utf-8") as f:. - Ieraksti zem tā ar atkāpi
f.write("Pirmā rinda\n"). - Palaid un pārbaudi, vai mapē parādījās
dati.txt. - Atver failu VS Code un izlasi tā saturu.
- Pievieno kodam
with open("dati.txt", "r", encoding="utf-8") as f:un izdrukāf.read(). - 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.
- Palaid savu rakstīšanas kodu vēl divas reizes.
- Atver
dati.txtun saskaiti rindas. - Nomaini režīmu no
"w"uz"a". - Palaid vēl divas reizes un saskaiti rindas vēlreiz.
- Pieraksti, kurā gadījumā rindas krājās un kurā ne.
- 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.
- Ieraksti pirmajā rindā
import json. - Izveido vārdnīcu ar atslēgām
vards,punktiun sarakstumateriali. - Saglabā to ar
json.dump(dati, f, indent=4)failāsave.json. - Atver
save.jsonVS Code un apskati, kā tas izskatās. - Nolasi failu atpakaļ ar
ielade = json.load(f). - Izdrukā
ielade["punkti"]. - 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.
- Ieraksti failā piecas rindas ar režīmu
"a". - Nolasi failu ar
for rinda in f:ciklu. - Izdrukā katru rindu ar
print(rinda.strip()). - Pieraksti, ko mainīja
.strip(). - 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 parametruopen()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. Aizmirstsimport: Tu nevari izmantotjson.dump()vaicsv.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']}")
Ielādēts profils: Anna