You are on page 1of 51

Bevezetés a

programozásba
DIGITÁLIS KULTÚRA 11.
Fájlok kezelése
Milyen fájlok léteznek?
• Nagyon leegyszerűsítve, vannak a:

• Szöveget tartalmazó fájlok


• És minden más

• Szöveget tartalmazó fájl alatt az egyszerű, formázatlan szöveget értjük, tehát a Word
fájlok nem tartoznak ide
• Kiterjesztések: .txt, .csv, .html stb.
Szövegfájlok beolvasása

forrásfájl = open('allatok.txt’)

for sor in forrásfájl:


print(sor)

forrásfájl.close()
Túl sok a sor
• A szövegfájlok sorainak végén található egy újsor karakter
• Ezen kívül a print() is tesz egy újsor karaktert a kiírt szöveg végére
• Emiatt dupla újsor van kiíráskor a fájl két sora között

• Megoldás: a szöveg sorainak végéről vegyük le a felesleges karaktereket


• Erre való a strip() utasítás:

print(sor.strip())
Kiírás helyett tároljuk el
• A feladatok megoldása során általában nem kiírni szeretnénk a fájl tartalmát a
képernyőre, hanem el szeretnénk tárolni az adatokat, hogy dolgozhassunk velük

forrásfájl = open('allatok.txt’)

állatok = []
for sor in forrásfájl:
sor = sor.strip()
állatok.append(sor)

forrásfájl.close()
Állatok.txt
• Egy sorban egy állat adatai találhatók, szóközzel elválasztva

• Név
• Fajta
• Kor
Daraboljuk fel a sort
• Ha a sort feldaraboljuk, akkor az egész beolvasás eredménye egy kétdimenziós lista

forrásfájl = open('allatok.txt’)

állatok = []
for sor in forrásfájl:
sor = sor.strip().split(" ")
állatok.append(sor)

forrásfájl.close()
Adatok típusa
• A fájlból beolvasott adatok alapértelmezésben mindig szöveg (string) típusúak
• Ezért ha pl. a korral számolni szeretnénk, számmá kell alakítanunk

forrásfájl = open('allatok.txt’)

állatok = []
for sor in forrásfájl:
sor = sor.strip().split(" ")
sor[2] = int(sor[2])
állatok.append(sor)

forrásfájl.close()
Ugyanez szótárral
• Természetesen ugyanezt megcsinálhatjuk szótárral is

forrásfájl = open('allatok.txt’)

állatok = []
for sor in forrásfájl:
sor = sor.strip().split(" ")
szótár = {'név': sor[0], 'fajta': sor[1], 'kor': int(sor[2])}
állatok.append(szótár)

forrásfájl.close()
Típusalgoritmusok bekért adatokkal
forrásfájl = open('allatok.txt')

állatok = []
for sor in forrásfájl:
sor = sor.strip().split(" ")
szótár = {'név': sor[0], 'fajta': sor[1], 'kor': int(sor[2])}
állatok.append(szótár)

forrásfájl.close()

legöregebb = állatok[0] # ez az egész állat


for állat in állatok:
if állat['kor'] > legöregebb['kor']:
legöregebb = állat
Fájlok írása
• Írjuk ki a legöregebb állat nevét és fajtáját a oreg.txt fájlba

célfájl = open('oreg.txt', 'w')


print(legöregebb['név'], legöregebb['fajta'], file=célfájl)
célfájl.close()

A fájlt írásra kell megnyitni –


alapértelmezésben csak olvasni lehet belőle

Ez mondja meg, hogy ne a képernyőre írjon,


A megnyitott fájlt mindig le kell zárni,
hanem a fájlba
ha már nem használjuk!
Problémák az ékezetekkel
• Windows operációs rendszeren a Python alapból nem UTF-8 karakterkódolást használ a
fájlokban
• Emiatt ha ékezetes karakterekkel dolgozunk fájlokban, akkor ezek nem jól fognak
megjelenni
Karakterkódolás megadása
• Mindig, amikor open()-t használunk, legyen az olvasás vagy írás, meg kell mondanunk,
hogy UTF-8 karakterkódolást szeretnénk használni

• Fájl olvasásakor:
forrásfájl = open('allatok.txt', encoding='utf-8')
• Fájl írásakor:
célfájl = open('oreg.txt', 'w', encoding='utf-8')
Egyetlen sor beolvasása
• Érettségi feladatokban sokszor előfordul, hogy az első sor különleges, más van benne
mint a többiben
• Az is előfordul, hogy egy „objektum” két sort is elfoglal

• Ilyenkor a for-os beolvasás önmagában nem mindig célravezető


• Egyetlen sort is beolvashatunk:

első = forrás.readline()
Összetett
típusalgoritmusok
Összetett?
• Az eddigi típusalgoritmusok: összegzés, megszámlálás, eldöntés, kiválasztás, keresés,
min/maximumkiválasztás
• Ezek egy listához egyetlen értéket rendeltek, pl. az elemek összegét, vagy a legnagyobb
elemet

• Az összetett típusalgoritmusok ugyanúgy listával fognak dolgozni, de eredményük egy


másik lista lesz
Másolás
1. Járjunk be egy listát
2. Valamilyen módon alakítsuk át az egyes elemeket
3. Gyűjtsük egy másik listába az így kapott, átalakított elemeket

• Amint látható, az eredeti lista tartalma nem módosul


Másolás: példa
• A bevételek listában egy taxis bevételei vannak. A taxisnak jelentős adóterhei vannak: a
bevétele egészre kerekített 49%-áról le kell mondania.

bevételek = [1, 5, 2, 3, 4]
adózott_bevételek = []

for bevétel in bevételek:


adó = round(bevétel * 0.49)
marad = bevétel - adó
adózott_bevételek.append(marad)

print(f'A taxis adózott bevételei: {adózott_bevételek}')


Másolás: 1. feladat
• A róka, a libák, és a farkas esete. A farkas a 3 kilónál nehezebb libákat elveszi a rókától.
Adjuk meg azt a listát, ami a farkassal való találkozás utáni állapotot tartalmazza!
Az elvett libák súlyához írjunk nullát!

libák = [1, 5, 2, 3, 4]
róka_libái = []
Másolás: 2. feladat
• Adjuk meg a köszöntések listában, hogy az allatok.txt-ben található állatok, milyen
hangon köszöntenek bennünket! Az állatok a fájlban található sorrendben szólalnak
meg.

állathangok = {'kacsa': 'háp', 'kutya': 'vaú',


'birka': 'bee', 'kecske': 'mek',
'szarvasmarha': 'mú', 'liba': 'gá',
'malac': 'röff', 'kakas': 'qqriq',
'macska': 'nyaú'}

köszöntések = []
Kiválogatás
1. Járjunk be egy listát
2. Most nem alakítjuk át az elemeket, csak az eredeti formában átmásoljuk őket, de nem
mindet, csak egy bizonyos feltételnek megfelelőket

• Az eredmény most is egy másik lista, az eredeti lista pedig nem módosul
Szétválogatás
1. Járjunk be egy listát
2. Most több új lista is keletkezik:
• az egyikbe azok kerülnek, amik megfeleltek egy feltételnek, a másikba amelyek nem
• vagy az egyik feltételnek megfelelők az egyik új listába kerülnek, egy másik feltételnek megfelelők egy
másik új listába
Szétválogatás: feladat
• Gyűjtsük a megfelelő listába azokat a libákat, amelyeket megtarthat a róka, és azokat,
amelyeket elvesz a farkas!

libák = [1, 5, 2, 3, 4]
róka_libái = []
farkas_libái = []
Gyakorlófeladatok
1. Gyalogtúra
• A tura.txt állományban egy gyalogtúrán 3 percenként rögzített magassági adatokat
találunk. Minden adat egyetlen sorban van, egymástól vesszővel elválasztva.
• Olvassuk be a fájlt, és állítsunk elő egy olyan listát, ami azt mutatja, hogy „Fel” vagy „Le”
változott-e a túrázónál a magasság az előző mérési pont óta! Ha megegyezett a két
érték, egyenlőségjelet tegyünk a listába!

• A megoldás algoritmusa a következő dián található – kódoljuk le!


1. Gyalogtúra
Program szintmérés:
magasságok := fájlból beolvasott adatok listában
irányok := üres lista

ciklus i = 1-től (magasságok elemszáma)-1 -ig


ha magasságok[i] < magasságok[i-1], akkor
irányok := irányok + „Le”
különbenha magasságok[i] > magasságok[i-1], akkor
irányok := irányok + „Fel”
különben irányok := irányok + „=”
ciklus vége
Program vége.
2. Eszperente
• Kérj be a felhasználótól egy szöveget!
• Minden magánhangzót cserélj e betűre, az eredményt pedig egy másik string típusú
változóban tárold, majd írd ki a képernyőre!

• Mint látható, ezek a típusalgoritmusok nem csak listákon értelmezhetők


3. Kutya- és macskaoltások
• Minden kutyánkat és macskánkat be szeretnénk oltatni. Mindegyiknek adnánk
veszettség elleni oltást, a kutyáknak pedig még parvovírus ellenit is.
• Olvassuk be az allatok.txt tartalmát
• Gyűjtsük az oltás nevének megfelelő listába azoknak az állatoknak a nevét, amelyek az
adott oltást kapni fogják!
• Írjuk ki mindkét lista tartalmát a képernyőre!
4. Tojásrakók
• Van egy listánk arról, hogy melyik fajok egyedei raknak tojást.
tojásrakó_fajok = ['kacsa', 'liba', 'kakas']
tojásrakók_nevei = []
• Gyűjtsük ki azoknak az állatoknak a nevét az allatok.txt állományból, amelyeknél
előfordulhat ez az esemény!
5. Összetett feladat
1. Hány állatunk van összesen?
2. Melyik állatunk a legöregebb?
3. Van-e olyan fajú állatunk, amelyet a felénk járó postás (a felhasználó) kérdezett?
4. Írjuk ki az állatfajok listáját! Kérjünk be egy fajnevet a felhasználótól, majd írjuk ki, hogy
az egyéves állataink között van-e ilyen fajú!
5. Melyik állatfajhoz tartozó állatból van a legtöbb?
6. Mennyi az állataink átlagéletkora fajonként?
7. Írjuk ki az egyes állatok neveit a fajuknak megfelelő nevű szövegfájlba!
Rendezések
Egyszerű cserés rendezés
• Az első elemet összehasonlítjuk az összes mögötte lévővel
• Ha valamelyik a későbbiek közül kisebb, mint az első, akkor a kettőt megcseréljük
• A nagyobb elem így az adatsor vége felé mozdul, a kisebb pedig az eleje felé

• Ezt az összes elemre elismételjük

• https://anim.ide.sk/rendezesi_algoritmusok_1.php
Egyszerű cserés rendezés algoritmusa
lista = [5, 3, 9, 1, 7]

for egyik in range(len(lista)-1):


for másik in range(egyik+1, len(lista)):
print(lista, 'ezeket hasonlítom:', egyik, másik, end=' ')

if lista[egyik] > lista [másik]:


lista[egyik], lista[másik] = lista[másik], lista[egyik]
print('csere volt, új sorrend:', lista[egyik], lista[másik],
'a lista a csere után:', lista)
else:
print('nem cserélünk')
A beépített módszer 1. – sorted()

lista = [5, 3, 9, 1, 7] A sorted() utasítás nem módosítja az eredeti


listát.
rendezett = sorted(lista) Az eredményt nekünk kell elmentenünk.
print(lista, rendezett)

fordítva_rendezett = sorted(lista, reverse=True)


print(lista, fordítva_rendezett)
Rendezés visszafelé
(legnagyobbtól legkisebbig)
A beépített módszer 2. – sort()

lista = [5, 3, 9, 1, 7]
A sort() „helyben rendez”, azaz az eredeti
lista tartalma módosul.
lista.sort()
print(lista)

lista.sort(reverse=True)
print(lista)
Rendezés visszafelé
(legnagyobbtól legkisebbig)
Szövegek rendezése
A nagybetűk előbb vannak, mint bármelyik kisbetű

lista = ['Dalmata', 'bakancs', 'alma', 'alap']


print(sorted(lista))
# ['Dalmata', 'alap', 'alma', 'bakancs']

lista = ['Albert', 'Dénes', 'Ármin', 'Dezső']


print(sorted(lista))
# ['Albert', 'Dezső', 'Dénes', 'Ármin']

Az ékezetes karakterek az összes után jönnek


Rendezés – 1. feladat
a) Gyűjtsük ki a tanyánkon élő állatok közül a kutyák, macskák és kakasok neveit
b) Írjuk ki a nevüket előbb ABC rendben
Kerekítés 1.
• Kerekítés a round() utasítással

tört = 3.1415
tört = round(tört, 2) # 3.14

print(round(tört)) # 3
Kerekítés 2.
• Kerekítés f-sztringes kiíráskor:

tört = 3.1415

print(f"A szám két tizedesjeggyel: {tört:.2f}")


print(f"A szám egészre kerekítve: {tört:.0f}")
print(f"Kerekítve, három jegyen, kitöltő nullákkal: {tört:03.0f}")

A szám két tizedesjeggyel: 3.14


A szám egészre kerekítve: 3
Kerekítve, három jegyen, kitöltő nullákkal: 003
Formázás

for x in range(1, 11):


print(f'{x:02} {x*x:3} {x*x*x:4}')
Néhány gyorsabb
(haladó) lehetőség
Min() / Max()
• Megkeresi a legkisebb / legnagyobb elemet
• A paraméterben kapott számok között
• Vagy a paraméterben megadott lista elemei között
• Szövegek esetében ABC szerint értendő

legkisebb = min(3,6,2,1) # 1

lista = [3,5,6,2,1,7,9,8,2,210,43,64,2,31,54]
legkisebb = min(lista) # 1
legnagyobb = max(lista) # 210
Sum()
• Egy lista elemeinek összegzése

lista = [3,5,6,2,1,7,9,8,2,210,43,64,2,31,54]
összeg = sum(lista) # 447
Listaértelmezés
• Segítségével egy lista elemeit nagyon tömör formában alakíthatjuk át, vagy szűrhetjük
meg
Másolás listaértelmezéssel
• Másoljuk át minden szám kétszeresét listaértelmezés használatával!

lista = [3,5,6,2,1,7,9,8,2,210,43,64,2,31,54]
ketszeres = [szam * 2 for szam in lista]
# [6, 10, 12, 4, 2, 14, 18, 16, 4, 420, 86, 128, 4, 62, 108]

1. Nevezzük el szam-nak a lista éppen nézett


elemét!

2. Az új listába minden elem kettővel szorzott


változata kerüljön
Kiválogatás listaértelmezéssel
lista = [3,5,6,2,1,7,9,8,2,210,43,64,2,31,54]
nagyobb10 = [szam for szam in lista if szam > 10]
# [210, 43, 64, 31, 54]

1. Most nem módosítjuk a számot


2. Viszont csak azokat a számokat szeretnénk
megkapni, amelyek esetén igaz a feltétel

lista = [3,5,6,2,1,7,9,8,2,210,43,64,2,31,54]
paros = [szam for szam in lista if szam % 2 == 0]
# [6, 2, 8, 2, 210, 64, 2, 54]
Összetett adatszerkezetek rendezése
• Egyszerű listákat tudunk rendezni a lista.sort() utasítással
lista = [3,5,6,2,1,7,9,8,2,210,43,64,2,31,54]
lista.sort()
# [1, 2, 2, 2, 3, 5, 6, 7, 8, 9, 31, 43, 54, 64, 210]

• Probléma: ugyanez összetett adatszerkezetekben nem működik, mert nem tudja, melyik
kulcs szerint rendezzen
osztály = [
{"név": "Noémi", "nem": "l", "kor": 15},
{"név": "Dezső", "nem": "f", "kor": 17},
{"név": "Gizi", "nem": "l", "kor": 16},
{"név": "Edömér", "nem": "f", "kor": 16}
]
Lambda függvény
• A lambda függvény a függvények egy nagyon tömör formája
• Olyan, mintha csak egyetlen return utasításból állna a függvény, de még azt sem kell
kiírni
• Mindkét alábbi függvény egy szótár ‚név’ kulcsát adja vissza:
def név(személy):
return személy['név']

lambda személy: személy['név']

• A lambda függvényeknek nincsen neve, ezért így, „önállóan” sosem használjuk, mivel
nem tudnánk meghívni
Rendezés lambda függvénnyel
• A lambda függvényeket arra fogjuk tudni használni, hogy az összetett adatszerkezetből
„kinyerjük” azt az egy értéket, ami alapján rendezni szeretnénk
osztály = [
{"név": "Noémi", "nem": "l", "kor": 15},
{"név": "Dezső", "nem": "f", "kor": 17},

]
osztály.sort(key=lambda személy: személy['név’])
Az egész összetett adatszerkezetet rendezi, minden adat megmarad,
de a rendezés során csak a név kulcsot veszi figyelembe.

print(osztály)
# [{'név': 'Dezső', ...., {'név': 'Edömér', ....
A 11. osztályos
tananyag vége

You might also like