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!
#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.
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:
fajl = open("pelda.txt", "r")
print(fajl.read(10))
Van lehetőség a fájl első sorának beolvasására is: readline()
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:
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:
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.
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!
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.
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.
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!
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ó)") |
