Fájlkezelés során valamely háttértárról tudunk beolvasni adatokat a számítógép memóriájába, vagy adatokat kiírni onnan fájlba. Egy fájlnak van neve, kiterjesztése, elérési útja. A benne tárolt adatokat hosszú távon akarjuk megőrizni.
Alapvetően 3 lépés az egész: fájl megnyitása, tatalom beolvasása a memóriába, (módosításuk) fájl lezárása.
Fájl megnyitása: open() függvény
Az open függvény paramétereként a fájl elérési útját kell megadni. (relatív elérési út!)
Egyéb paraméterek:
"r"
– Read – Alapértelmezetten olvasásra nyitja meg a fájlt. Ha a fájl nem létezik hibát ad vissza: FileNotFoundError. Tehát célszerű ellenőrizni, hogy létezik-e az adott fájl! os.path.exist(fájlnév)
"a"
– Append – Fájl megnyitása hozzáfűzésre (tartalom hozzáadása). Ha a fájl még nem létezik, akkor létrehozza.
"w"
– Write – Fájl megnyitása íráshoz, ha nem létezik a fájl akkor ez is létrehozza.
"x"
– Create – Létrehozza a megadott fájlt, hibát dob, ha a fájl már létezik
„encoding” Karakterkódolás. Alap esetben a Windows az ANSI szabványt használja, ezért célszerű átalakítani a szöveget utf-8-ra, ha nem akarunk furcsa ékezetes karaktereket kapni.
with parancs: ha a with paranccsal együtt nyitjuk meg a fájlt, akkor nem kell külön lezárni!
Alapesetben a fájlokat szövegként kezeli a Python („t” paraméter, elhagyható), de a „b” paraméterrel van lehetőség bináris módra is. pl. képek, hangok, videók stb. esetében.
Fájl bezárása: close() A fájlt megnyitás, olvasás (módosítás) után le is kell zárni!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#Fájl tartalmának kiírása képernyőre fajl = open("pelda.txt", "r") print(fajl.read()) fajl.close() #Fájl tartalmának mentése változóba, stringként fajl = open("pelda.txt", "r") valtozo = fajl.read() fajl.close() #Fájl megnyitása, hibakezelés nélkül forras = open('pelda.txt') for sor in forras: print(sor) forras.close() #Fájl megnyitása, hibakezelés nélkül, with paranccsal forras = with open('pelda.txt') for sor in forras: print(sor) #Fájl megnyitása hibakezeléssel import os fajlneve = 'pelda.txt' if os.path.exists(fajlneve): forras = open(fajlneve,encoding='utf-8') for sor in forras: print(sor) #print(sor.strip()) felesleges soremelések eltávolítása forras.close() else: print('A',fajlneve,'fájl nem található!') #forras.seek() Ha újra a fájl elejére akarunk lépni, és még nem zártuk be a fájlt! |
Fájl tartalmának kiíratása, kicsit részletesebben:
Ha az egészet szimplán ki szeretnénk íratni akkor használjuk a read() metódust. tulajdonképpen a beolvasott tartalmat átirányítjuk a képernyőre.
1 2 |
fajl = open("\mappa\pelda.txt", "r") print(fajl.read()) |
Van lehetőség csak megadott számú karakter kiírására is. pl: Első 10 karakter kiíratása:
1 2 |
fajl = open("pelda.txt", "r") print(fajl.read(10)) |
Van lehetőség a fájl első sorának beolvasására is: readline()
1 2 |
fajl = open("pelda.txt", "r") print(fajl.readline()) |
Van lehetőség a fájl tartalmát listába is beolvasni a readlines() függvénnyel. Nyilván itt feltételezzük, hogy több sornyi szövegünk van a txt-ben. Ebben a példában minden második sor szövegét iratom ki:
1 2 3 4 5 |
fajl = open('tobbsoros.txt',encoding='utf-8') sorok = fajl.readlines() fajl.close() for i in range(1,len(sorok),2): print(sor[i].strip()) |
Fájl beolvasása soronként for ciklussal:
1 2 3 |
fajl = open("pelda.txt", "r") for x in fajl: print(x) |
Írás fájlba
Itt két lehetőség merül fel: már létező fájl szeretnénk módosítani, vagy új fájlt létrehozni és azzal dolgozni.
Új fájl létrehozása
Ahogy korábban már említettem, az open() metódus különböző paramétereivel tudunk létrehozni új fájlt.
"x"
– Új fájlt hoz létre. Ha az adott néven már létezik fájl, hibaüzenetet ad.
"a"
– append Hozzáfűzés, ha létezik a fájl. Ha még nem akkor létrehozza.
"w"
– write Írás fájlba. Ha még nem létezik a megadott fájl, akkor létrehozza.
1 2 3 |
fajl = open("pelda.txt", "x") fajl = open("pelda.txt", "a") fajl = open("pelda.txt", "w") |
Létező fájl módosítása
Az open() függvénnyel tudjuk megnyitni a fájlt, a következő paraméterekkel:"a"
– append – Hozzáfűzés, a szöveg végéhez, tehát az addigi tartalom megmarad."w"
– write – Felülírja a fájl meglévő tartalmát!
1 2 3 4 5 6 |
fajl = open("peldafajl.txt", "a") fajl .write("Egy új mondat, hurrá!") fajl .close() #fájl megnyitása hozzáírás után, tartalma fajl = open("peldafajl.txt", "r") print(fajl .read()) |
Fájl és könyvtár törlése
Fájl törléséhez importálni kell az ‘os’ modult. Törölni az os.remove() függvénnyel lehet. Törlés előtt is célszerű leellenőrizni, hogy létezik-e a fájl, ne dobjon hibát a program.
1 2 3 4 5 |
import os if os.path.exists("peldafajl.txt"): os.remove("peldafajl.txt") else: print("A megadott fájl nem létezik!") |
Könyvtár törléséhez szintén az os modul szükséges, azon belül az os.rmdir() függvény.
1 2 |
import os os.rmdir("mappaneve") |
Gyakorlás – fájlkezelés
Írjuk ki a hétköznapokat egy txt fájlba, majd fűzzük hozzájuk a hétvégi napokat is! Írassuk ki a képernyőre a fájl tartalmát!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
napok = ['hétfő','kedd','szerda','csütrötök','péntek'] #fajl = open('hetnapjai.txt','w',encoding='utf-8') fajl = open('hetnapjai.txt','w') for nap in napok: #print(nap,file=fajl) fajl.write(nap+' ') fajl.close() #tartalom kiírása a kijelzőre fajl = open("hetnapjai.txt", "r") print(fajl .read()) #hozzáfűzés fajl = open('hetnapjai.txt','a',encoding='utf-8') print('szombat',file=fajl) print('vasárnap',file=fajl) fajl.close() #tartalma fajl = open("hetnapjai.txt", "r") print(fajl .read()) |
Fájl tartalmának mentése listába, és csak a megadott feltételeknek megfelelő adatok kiíratása:
alloviz.txt
id nev tipus terulet vizgyujto
1 Gyova-Mámai-Holt-Tisza morotvató 1,33 35
2 Abaligeti-horgásztó mesterséges 0,025
3 Délegyházi-tavak bányató 3,38 3
4 Öregállás III. tó 0,98 1
5 Serházzugi-Holt-Tisza morotvató 1,34 9
6 Palotási-tározó mesterséges 0,58 57
7 Csongrádi-Bokrosi-Sós-tó morotvató 1,21 6
8 Csór-réti-víztározó mesterséges 0,12 8
9 Tunyogmatolcsi-tározó 1,93 1
10 Tiszadobi-Holt-Tisza morotvató 1,03 208
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# A fájl betöltése adatok = open("alloviz.txt", encoding='utf-8').read().splitlines() # A nevek és típusok kiválasztása nevek = [sor.split("\t")[1] for sor in adatok] tipusok = [sor.split("\t")[2] for sor in adatok] # Csak a bányatavak kiválasztása banyaravak = [] for i in range(len(nevek)): if tipusok[i] == "bányató": banyaravak.append(nevek[i]) # A nevek és típusok kiírása for nev in banyaravak: print(f"{nev} (bányató)") |