Kihagyás

10. Fájlkezelés

Eddig egy nagyon komoly problémával küzdöttek a programjaink: "amnéziásak" voltak. Bármilyen adatot (neveket, pontszámokat) is tároltunk el a változókban vagy listákban, amint bezártuk a programot, minden végleg törlődött a számítógép memóriájából.

Ahhoz, hogy az adataink maradandóak (perzisztensek) legyenek, ki kell írnunk őket a háttértárra (például a merevlemezre vagy SSD-re), egy fájlba. A leggyakrabban egyszerű, tiszta szövegfájlokkal (.txt) dolgozunk.

10.1. Fájlok megnyitása: A with open() varázslata

Más nyelvekben (például C#-ban) a fájlkezelés veszélyes üzem: meg kell nyitni a fájlt, bele kell írni, és a legvégén kötelező manuálisan lezárni. Ha elfelejted lezárni, a fájl megsérülhet vagy zárolva maradhat.

A Python kínál erre egy szuperbiztonságos és kényelmes módszert: ez a with open() (nyisd meg ezzel) szerkezet. Amikor ezt használjuk, a Python a behúzott blokk (indentáció) végén automatikusan lezárja a fájlt, még akkor is, ha közben valami hiba történik!

10.2. Szövegfájl beolvasása (Olvasás mód)

Tegyük fel, hogy van egy diakok.txt fájlunk, amiben nevek vannak egymás alatt. Ezt szeretnénk beolvasni. Ehhez a megnyitáskor meg kell adnunk a fájl nevét, és az "r" (read = olvasás) betűt, mint megnyitási módot.

Fontos: Érdemes mindig odaírni az encoding="utf-8" paramétert is, különben a gép (főleg Windows alatt) nem fogja tudni jól beolvasni a magyar ékezetes betűket!

# A fájl megnyitása olvasásra ("r")
with open("diakok.txt", "r", encoding="utf-8") as fajl:
    # A read() metódus a fájl TELJES tartalmát egyetlen hatalmas szövegként beolvassa
    tartalom = fajl.read()
    print(tartalom)

# Itt (a behúzás megszüntetésével) a fájl már automatikusan le is zárult!

Olvasás soronként (A legproblémamentesebb módszer): Ha egy fájlban ezer sor van, nem jó ötlet egyszerre beolvasni az egészet. Sokkal profibb, ha egy for ciklussal, soronként megyünk végig rajta. A Python ezt is végtelenül leegyszerűsíti: maga a fajl változó úgy viselkedik, mint egy lista!

with open("diakok.txt", "r", encoding="utf-8") as fajl:
    for sor in fajl:
        print(sor.strip()) # A strip() eltávolítja a felesleges sortöréseket és szóközöket!

10.3. Fájlba írás és Hozzáírás

Ha adatot akarunk kimenteni egy fájlba, kétféle írási mód közül választhatunk.

1. Az "Írás" mód ("w" - write)

Ha a "w" módot használod, a Python létrehozza a fájlt, ha még nem létezett. ⚠️ VIGYÁZAT: Ha a fájl már létezett, a "w" mód azonnal, kérdés nélkül letörli a fájl teljes korábbi tartalmát, és tiszta lappal kezdi az írást!

# Új fájl létrehozása (vagy a meglévő felülírása)
with open("eredmenyek.txt", "w", encoding="utf-8") as kimenet:
    kimenet.write("Első helyezett: Anna\n") # A \n jelzi, hogy ugorjon új sorba!
    kimenet.write("Második helyezett: Béla\n")

2. A "Hozzáírás" mód ("a" - append)

Ha nem akarod letörölni az eddigi adatokat, csak a fájl legvégéhez szeretnél új sorokat fűzni, az "a" (append) módot kell használnod! Ez olyan, mint amikor új bejegyzést írsz egy napló végére.

# Hozzáírás a már meglévő fájlhoz
with open("eredmenyek.txt", "a", encoding="utf-8") as kimenet:
    kimenet.write("Harmadik helyezett: Cecil\n")

10.4. Fájlkezelési Módok Összefoglalója

Mód betűjele Angol név Mit csinál? Veszélyes?
"r" Read Csak olvassa a fájlt. Hibát ad, ha a fájl nem létezik. Biztonságos
"w" Write Írja a fájlt. Ha nem létezik, létrehozza. Ha létezik, letörli a korábbi tartalmát! ⚠️ Veszélyes (adatvesztés)
"a" Append Hozzáír a fájl végéhez. Nem törli a korábbi adatokat. Biztonságos

💻 Feladatok

  1. Bevásárlólista mentése ("w" mód): Készíts egy új Python programot! A program a with open szerkezet és a "w" mód segítségével hozzon létre egy lista.txt nevű fájlt, és a .write() metódussal írjon bele 3 tetszőleges terméket egymás alá! (Ne felejtsd el a \n újsor karaktert a szavak végén!)
  2. Lista beolvasása ("r" mód): Készíts egy másik fájlt (vagy töröld ki az előző kódját)! Írj egy programot, amely az "r" mód és egy for ciklus segítségével beolvassa az előbb létrehozott lista.txt tartalmát, és kiírja a képernyőre! (Használd a .strip() metódust a felesleges üres sorok eltüntetésére!)
  3. Naplózás ("a" mód): Írj egy programot, amely bekéri a felhasználó nevét az input() függvény segítségével! Ezután nyissa meg a latogatok.txt fájlt hozzáírás ("a") móddal, és fűzze hozzá a beírt nevet a fájl végéhez! Futtasd le a programot háromszor különböző nevekkel, majd nyisd meg a latogatok.txt fájlt a szerkesztődben, és ellenőrizd, hogy tényleg mind a három név benne van-e!