====== 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)