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
- Bevásárlólista mentése (
"w"mód): Készíts egy új Python programot! A program awith openszerkezet és a"w"mód segítségével hozzon létre egylista.txtnevű 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!) - 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 egyforciklus segítségével beolvassa az előbb létrehozottlista.txttartalmát, és kiírja a képernyőre! (Használd a.strip()metódust a felesleges üres sorok eltüntetésére!) - Naplózás (
"a"mód): Írj egy programot, amely bekéri a felhasználó nevét azinput()függvény segítségével! Ezután nyissa meg alatogatok.txtfá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 alatogatok.txtfájlt a szerkesztődben, és ellenőrizd, hogy tényleg mind a három név benne van-e!