Table of Contents
Fájlkezelés (szövegfájl olvasás/írás), hibakezelés (try/except)
Mi az a fájlkezelés?
Eddig az adat:
- program futása közben létezett
- a program leállásával elveszett
- Fájl = tartós adattárolás (pl. .txt).
Alap minta:
#r = read (olvasás)
#w = write (felülír)
#a = append (hozzáfűz)
f = open("adat.txt", "r")
tartalom = f.read()
f.close()
Fájl olvasása
Tegyük fel, hogy az adat.txt tartalma: 10 20 30
#Beolvasás:
with open("adat.txt", "r") as f:
tartalom = f.read()
print(tartalom)
#Sorokra bontás:
with open("adat.txt", "r") as f:
sorok = f.readlines()
print(sorok)
Feladat: Olvass be egy fájlt. Tárold el a sorokat listában. Írd ki hány sorból áll.
with open("adat.txt", "r") as f:
sorok = f.readlines()
print("Sorok száma:", len(sorok))
Feladat: Az adat.txt fájl számokat tartalmaz, soronként egyet. Írj programot, ami:
- Beolvassa a számokat
- Listába teszi őket (float-ként)
- Kiszámolja az összegüket
szamok = []
with open("adat.txt", "r") as f:
for sor in f:
szamok.append(float(sor.strip()))
osszeg = 0
for szam in szamok:
osszeg += szam
print("Összeg:", osszeg)
#vagy:
print(f"Összeg: {sum(szamok)}")
Fájl írása
with open("eredmeny.txt", "w") as f:
f.write("Ez egy teszt.\n")
#w mód felülírja a fájlt
Feladat: Írj programot, ami:
- Bekér 3 számot
- Fájlba menti őket soronként
with open("szamok.txt", "w") as f:
for i in range(3):
szam = input("Adj meg egy számot: ")
f.write(szam + "\n")
Hibakezelés (try/except)
Hiba példa:
- szam = int(“abc”)
try:
szam = int(input("Adj meg egy számot: "))
print("Sikeres konvertálás")
except ValueError:
print("Hibás adat!")
Feladat: Írj programot, ami:
- addig kér be számot,
- amíg a felhasználó helyes számot nem ad meg
while True:
try:
szam = float(input("Adj meg egy számot: "))
break
except ValueError:
print("Nem számot adtál meg, próbáld újra!")
print("Megadott szám:", szam)
Feladat: Írj programot, ami:
- Beolvassa az adat.txt fájlt
- Kiszámolja az átlagot
- Kiírja egy új fájlba az eredményt
szamok = []
with open("adat.txt", "r") as f:
for sor in f:
szamok.append(float(sor.strip()))
osszeg = sum(szamok)
atlag = osszeg / len(szamok)
with open("atlag.txt", "w") as f:
f.write("Átlag: " + str(atlag))
print("Átlag kiszámolva és fájlba írva.")
Gyakorló feladatok
Feladat: Jegyek beolvasása és átlag számítása
Adott egy jegyek.txt fájl, amely soronként a következő formátumú:
Anna 5 4 3 Bence 2 3 4 Csaba 1 2
- Olvasd be a fájlt.
- Számold ki minden diák átlagát.
- Írd ki az eredményt egy atlagok.txt fájlba ilyen formában:
- Anna átlaga: 4.0
- Bence átlaga: 3.0
- Csaba átlaga: 1.5
- Ha a fájl nem létezik, kezeld hibával.
def atlag(lista):
if len(lista) == 0:
return 0
return sum(lista) / len(lista)
try:
with open("jegyek.txt", "r", encoding="utf-8") as f:
sorok = f.readlines()
except FileNotFoundError:
print("A jegyek.txt fájl nem található!")
else:
eredmeny = []
for sor in sorok:
adatok = sor.strip().split()
nev = adatok[0]
jegyek = []
for j in adatok[1:]:
try:
jegyek.append(int(j))
except ValueError:
print(f"Hibás jegy: {j}")
eredmeny.append(f"{nev} átlaga: {atlag(jegyek):.2f}")
with open("atlagok.txt", "w", encoding="utf-8") as f:
for sor in eredmeny:
f.write(sor + "\n")
Feladat: Szógyakoriság fájlból
Olvass be egy szoveg.txt fájlt.
- Számold meg a szavak előfordulását dictionary segítségével.
- Írd ki az eredményt gyakorisag.txt fájlba (szó – darabszám).
- Hibakezelés: ha a fájl nem létezik.
def szo_gyakorisag(szoveg):
szamlalo = {}
szavak = szoveg.split()
for szo in szavak:
szamlalo[szo] = szamlalo.get(szo, 0) + 1
return szamlalo
try:
with open("szoveg.txt", "r", encoding="utf-8") as f:
tartalom = f.read()
except FileNotFoundError:
print("A szoveg.txt nem található!")
else:
eredmeny = szo_gyakorisag(tartalom)
with open("gyakorisag.txt", "w", encoding="utf-8") as f:
for szo, db in eredmeny.items():
f.write(f"{szo} - {db}\n")
Feladat: Bevásárlólista és árösszesítés
Adott egy bevasarlas.txt fájl:
alma 300 korte 250 banan 400
- Olvasd be a fájlt.
- Számold ki az összértéket.
- Írd ki egy osszeg.txt fájlba.
- Kezeld, ha az ár nem szám.
def osszeg_szamitas(lista):
total = 0
for ar in lista:
total += ar
return total
arak = []
try:
with open("bevasarlas.txt", "r", encoding="utf-8") as f:
for sor in f:
adatok = sor.strip().split()
try:
ar = int(adatok[1])
arak.append(ar)
except (ValueError, IndexError):
print("Hibás sor:", sor.strip())
except FileNotFoundError:
print("A bevasarlas.txt nem található!")
else:
vegosszeg = osszeg_szamitas(arak)
with open("osszeg.txt", "w", encoding="utf-8") as f:
f.write(f"Összesen fizetendő: {vegosszeg} Ft\n")
Feladat: Naplófájl hibaszűrés
- Adott egy naplo.txt fájl.
- Írd ki külön fájlba (hibak.txt) azokat a sorokat, amelyek tartalmazzák az “ERROR” szót.
- Hibakezelés kötelező.
try:
with open("naplo.txt", "r", encoding="utf-8") as f:
sorok = f.readlines()
except FileNotFoundError:
print("A naplo.txt nem található!")
else:
hibak = []
for sor in sorok:
if "ERROR" in sor:
hibak.append(sor.strip())
with open("hibak.txt", "w", encoding="utf-8") as f:
for sor in hibak:
f.write(sor + "\n")
Feladat: Felhasználói adatok mentése és betöltése
Írj programot, amely:
- Bekér neveket és életkorokat.
- Elmenti egy felhasznalok.txt fájlba.
- Újra beolvassa a fájlt.
- Dictionary-be rendezi (név → életkor).
- Kiírja a 18 év alattiakat.
def ment_fajlba(adatok):
with open("felhasznalok.txt", "w", encoding="utf-8") as f:
for nev, kor in adatok:
f.write(f"{nev} {kor}\n")
def betolt_fajlbol():
felhasznalok = {}
try:
with open("felhasznalok.txt", "r", encoding="utf-8") as f:
for sor in f:
adatok = sor.strip().split()
try:
nev = adatok[0]
kor = int(adatok[1])
felhasznalok[nev] = kor
except (ValueError, IndexError):
print("Hibás adat:", sor.strip())
except FileNotFoundError:
print("A felhasznalok.txt nem található!")
return felhasznalok
# Példa adat
adatok = [("Anna", 17), ("Bence", 20), ("Csaba", 15)]
ment_fajlba(adatok)
felhasznalok = betolt_fajlbol()
print("18 év alattiak:")
for nev, kor in felhasznalok.items():
if kor < 18:
print(nev, kor)
Feladat: Adott egy diakok.txt fájl, amely a következő formátumú:
Anna;matek=5,tori=4,info=5 Bence;matek=2,tori=3 Csaba;matek=4,info=öt Dora;matek=5,tori=5,info=5
A program feladata:
- Olvassa be a fájlt.
- Alakítsa át az adatokat dictionary formára:
{ "Anna": {"matek": 5, "tori": 4, "info": 5}, ... }
- Hibakezelés:
- Ha a fájl nem létezik → hibaüzenet
- Ha egy jegy nem szám → jelezze, de a program menjen tovább
- Számolja ki minden diák átlagát.
- Írja ki az eredményt eredmeny.txt fájlba.
- Külön listázza a bukott diákokat (átlag < 2).
def fajl_beolvasas(fajlnev):
diakok = {}
try:
with open(fajlnev, "r", encoding="utf-8") as f:
sorok = f.readlines()
except FileNotFoundError:
print("A fájl nem található!")
return {}
for sor in sorok:
sor = sor.strip()
if not sor:
continue
try:
nev_resz, jegy_resz = sor.split(";")
except ValueError:
print("Hibás sorformátum:", sor)
continue
tantargyak = {}
jegyek = jegy_resz.split(",")
for adat in jegyek:
try:
tantargy, jegy = adat.split("=")
jegy = int(jegy)
tantargyak[tantargy] = jegy
except ValueError:
print(f"Hibás jegy adat: {adat} ({nev_resz})")
diakok[nev_resz] = tantargyak
return diakok
def atlag_szamitas(jegyek_dict):
if len(jegyek_dict) == 0:
return 0
return sum(jegyek_dict.values()) / len(jegyek_dict)
def eredmeny_mentes(fajlnev, diakok):
with open(fajlnev, "w", encoding="utf-8") as f:
for nev, jegyek in diakok.items():
atlag = atlag_szamitas(jegyek)
f.write(f"{nev} átlaga: {atlag:.2f}\n")
def bukottak_listaja(diakok):
bukott = []
for nev, jegyek in diakok.items():
atlag = atlag_szamitas(jegyek)
if atlag < 2:
bukott.append(nev)
return bukott
# -------- FŐPROGRAM --------
diakok = fajl_beolvasas("diakok.txt")
if diakok:
eredmeny_mentes("eredmeny.txt", diakok)
bukott = bukottak_listaja(diakok)
print("Bukott diákok:")
for nev in bukott:
print("-", nev)
