Kihagyás

Fájlkezelés

Pythonban a fájlkezelés első lépése mindig a fájl megnyitása. A fájl megnyitásához a open() függvényt használjuk. Ennek a függvénynek az első paramétere a fájl neve, míg a második paramétere a fájl megnyitási módját jelöli. A fájlt olvasásra, írásra vagy mindkettőre nyithatjuk meg.

A fájl megnyitási módját az alábbiak szerint adhatjuk meg:

  • r: olvasás
  • w: írás (a fájl tartalma törlődik)
  • a: hozzáfűzés
  • r+: olvasás és írás
  • w+: olvasás és írás (a fájl tartalma törlődik)

A fájl használata után mindig fontos, hogy lezárjuk azt a close() metódus segítségével.

Fájlok írása

Tegyük fel, hogy egy output.txt nevű fájlba szeretnénk írni. Ehhez először meg kell nyitnunk a fájlt írásra, majd a write() metódussal írhatunk bele. Az új sor kezdéséhez a \n karaktert használjuk.

Példa

file = open('output.txt', 'w')

file.write('Első sor!\n')
file.write('Második sor!')

file.close()

Lista fájlba írása

Adott egy lista, amely gyümölcsöket tartalmaz:

gyumolcsok = ["alma", "barack", "körte"]

Ezt a listát szeretnénk egy gyumolcsok.txt fájlba írni úgy, hogy minden elem külön sorba kerüljön.

Első lépésként egy ciklus segítségével bejárjuk a listát, majd az egyes elemeket a fájlba írjuk.

gyumolcsok = ["alma", "barack", "körte"]

file = open("gyumolcsok.txt", "w")

for gyumi in gyumolcsok:
    file.write(f"{gyumi}\n")

file.close()

Feladatok

Napló

Készíts egy programot, amely bekéri a felhasználótól egy tetszőleges szöveget, majd hozzáfűzi azt egy naplo.txt fájlhoz az alábbi formátumban:

[ÉÉÉÉ.HH.NN. ÓÓ:PP:MP] <szöveg>

Például:

[2025.01.20. 12:00:00] A VIP megérkezett.
Megoldás
import datetime

szoveg = input("Add meg a naplóbejegyzést: ")
datumido = datetime.datetime.now().strftime("%Y.%m.%d. %H:%M:%S")

file = open("naplo.txt", "a")
file.write(f"[{datumido}] {szoveg}\n")
file.close()

Fájlok olvasása

Egyszerű szöveges fájl olvasása

Egyszerű szöveges fájlokat (például .txt fájlokat) az alábbi módon olvashatunk be:

Hozzuk létre az input.txt nevű fájlt az alábbi tartalommal:

input.txt
1
2
3
Első sor
Második sor
Harmadik sor

Példa

file = open('input.txt', 'r')

for sor in file:
    print(sor)

file.close()

Futtassuk a programot és ellenőrizzük a kimenetet!

Első sor

Második sor

Harmadik sor

Láthatjuk, hogy több probléma is van.

Az egyik, hogy a sorok végén felesleges sortörés található. Ezt a strip() metódussal tudjuk eltávolítani. A másik, hogy a beolvasott szövegekben az ékezetes karakterek nem jelennek meg helyesen. Ezt a fájl megnyitásakor megadott encoding='utf-8' karakterkódolással tudjuk kezelni.

Módosítsuk a programot az alábbi módon:

file = open('input.txt', 'r', encoding='utf-8')

for sor in file:
    print(sor.strip())

file.close()

Fájl tartalmának beolvasása listába

Az előző példában használt módszer hátránya, hogy a fájl tartalma nem kerül eltárolásra. Ehhez szükségünk van egy olyan összetett adatszerkezetre, amely képes tárolni a fájl sorait.

Példa

sorok = []

file = open('input.txt', 'r', encoding='utf-8')
for sor in file:
    sorok.append(sor.strip())
file.close()

print(sorok)

CSV fájlok olvasása

A CSV (Comma Separated Values) fájlokban az adatokat vesszővel választjuk el. A fájl egy táblázatot képvisel, ahol az egyes sorok a rekordokat, az oszlopok pedig a rekordok mezőit jelölik.

CSV példa

Karakter Rend Lézerkard színe Midiklorián szám
Anakin Skywalker Jedi Kék 20000
Luke Skywalker Jedi Zöld 15000
Darth Vader Sith Piros 19000
starwars.csv
1
2
3
Karakter,Rend,Lézerkard színe,Midiklorián szám
Anakin Skywalker,Jedi,Kék,20000
Darth Vader,Sith,Piros,19000

A fájlok beolvasása ugyanúgy történik, mint a korábbi példákban, azonban a beolvasás után a sorokat a vessző karakter mentén kell feldarabolni.

CSV beolvasása

file = open('starwars.csv', 'r', encoding='utf-8')

for sor in file:
    darabolt = sor.strip().split(',')
    print(darabolt[0])

file.close()

Emlékeztető

A strip() metódus eltávolítja a sor végén található felesleges szóközöket és sortöréseket.
A split() metódus a sorokat a megadott karakter mentén darabolja fel.

CSV fájl beolvasása listába

Az előző példában alkalmazott módszer hátránya, hogy a fájl tartalma nem kerül eltárolásra. Hozzunk létre egy üres listát, majd a sorok kiírása helyett adjuk hozzá a beolvasott sorokat a listához.

CSV beolvasása listába

karakterek = []

file = open('starwars.csv', 'r')

for sor in file:
    darabolt = sor.strip().split(',')
    karakterek.append(darabolt)

file.close()

darabszam = len(karakterek)
print(f"Összesen {darabszam} karakter került beolvasásra.")

Első sor eltávolítása

Mint láthattuk, a CSV fájl első sora nem valós adatokat tartalmaz, hanem az úgynevezett fejlécet:

starwars.csv
1
2
3
4
Karakter,Rend,Lézerkard színe,Midiklorián szám
Anakin Skywalker,Jedi,Kék,20000
Darth Vader,Sith,Piros,19000
...

Ezt el kell távolítanunk a beolvasást követően. Mivel listáról van szó, kivehetjük a legelső elemet (első sort).

Példa

karakterek = []

file = open('starwars.csv', 'r')

for sor in file:
    darabolt = sor.strip().split(',')
    karakterek.append(darabolt)

file.close()

adatok.pop(0) # első sor eltávolítása

Rendezés oszlop szerint

A beolvasott CSV fájl tartalmát lehetőségünk van oszlop szerint rendezni.

Rendezzük a karaktereket midiklorián szám szerint!

karakterek = []

file = open('starwars.csv', 'r')

for sor in file:
    darabolt = sor.strip().split(',')
    karakterek.append(darabolt)

file.close()

karakterek.pop(0) # első sor eltávolítása

# adatműveletek

karakterek.sort(key=lambda sor: int(sor[3])) # a 3. int típusú oszlop alapján rendezem

Rendezzük a karaktereket lézerkardszín szerint!

karakterek = []

file = open('starwars.csv', 'r')

for sor in file:
    darabolt = sor.strip().split(',')
    karakterek.append(darabolt)

file.close()

karakterek.pop(0) # első sor eltávolítása

# adatműveletek

karakterek.sort(key=lambda sor: sor[2]) # a 2. oszlop alapján rendezem