Informatika2-2015/Eloadas 7 Python-7 Fajl kezeles Kitekintes

A MathWikiből
A lap korábbi változatát látod, amilyen Csirke (vitalap | szerkesztései) 2015. március 25., 11:39-kor történt szerkesztése után volt.
(eltér) ←Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

Tartalomjegyzék

Fájl kezelés

Fájl megnyitása

Fájlt a python beépített open() függvényével lehet megnyitni, hivatalos leírást röviden itt találhattok a használatáról általában. Ezt hasznos specifikusan megnézni, mert egyszerű programok írójaként a legtöbb programotok fájlokból fog olvasni és fájlokba fog írni.

Az open() függvénynek két paramétere van, az első a megnyitni kívánt fájl neve, a második pedig azt mondja meg, hogy mit akarunk csinálni a fájllal, egy karakterláncban. Egyelőre tekinthetjük úgy hogy a második paraméterre két lehetőség van, "r", ami azt jelenti hogy olvasni szeretnénk a fájlt, és "w", ami azt jelenti, hogy felül szeretnénk írni a fájl tartalmát. Az open() függvény egy file típusú objektummal tér vissza, a továbbiakban ezen az objektumon keresztül érjük el a fájlt. Nézzük meg miket tud:

Fájl olvasása

Legegyszerűbb módja a fájl végigolvasásának egy for ciklus, így valahogy:

fajl = open("adatok.txt", "r")
 
adatok = []
for sor in fajl:
    adatok.append(float(sor))

Ez a legegyszerűbb megoldás, de nem mindig alkalmazható, mert az kell hozzá, hogy a fájl összes sorát együtt kezeljük.

A további példákhoz tegyük fel, hogy van egy műszerünk ami egy adatsort olvasott le, és a számokat kiírta egy fájlba, minden sorba egyet. Ennek az adatsornak a beolvasására jó volt az előző példa is. De mi van ha a fájl első sorába leírja a műszer a saját azonosítóját (hogy tudjuk hogy honnan származnak az adatok), és csak a többi sor tartalmaz adatokat. Ekkor már mindjárt gondban vagyunk a for-al, mert nem minden sort kell egyformán kezelni.

Először is még ismerjük meg a file osztály readline() metódusát, ami csak egy sort olvas be a fájlból. Aztán amit még fontos megérteni, hogy a file objektum tárolja a belső állapotában hogy meddig lett már beolvasva a fájl. Ezért működik ebben az esetben a következő kód:

fajl = open("adatok.txt", "r")
 
muszer_azonosito = fajl.readline().strip()
 
adatok = []
for sor in fajl:
    adatok.append(float(sor))

A for ciklus nem az egész fájlt olvassa be, csak ami még hátravan. Még jobb példa erre, ha a műszer két adatsort is beolvas, mondjuk súlyt és térfogatot, és egy olyan sor választja el a két adatsort, ami csak azt tartalmazza hogy "--", tehát az adatfájl valahogy így néz ki:

Acme Muszer
1.21253
2.44362
3.19158
--
7.746
5.315
4.196

Ezt be lehet így olvasni:

fajl = open("adatok.txt", "r")
 
muszer_azonosito = fajl.readline().strip()
 
sulyok = []
for sor in fajl:
    if sor.strip() == "--":
        break
    sulyok.append(float(sor))
 
terfogatok = []
for sor in fajl:
    terfogatok.append(float(sor))

Ugyan két for ciklus is van, ami elvileg a fajl változón megy végig, mégis más eredményeket produkálnak. Ez azért van, mert a file típusú objektumok tárolják magukon belül hogy hol tartanak a fájlban, és a for ciklusnál is csak onnan kezdik olvasni ahol épp tartanak.

Fájl Írása

Ehhez képest a fájl írása egyszerű. A file osztálynak van egy write() metódusa, amivel egy karakterláncot beleírhatunk a fájlba.

fajl = open("adatok.txt", "w")
 
muszer = Muszer()
 
fajl.write(muszer.azonosito + "\n")
 
for suly in muszer.sulyok():
    fajl.write("{:.6}\n".format(suly))
 
fajl.write("--\n")
 
for terfogat in muszer.terfogatok():
    fajl.write("{:.4}\n".format(terfogat))
 
fajl.close()

Ez nagyjából hasonló ahhoz ahogy a print-tel kiírunk a parancssorba. Fontos különbségek, hogy ez csak egy karakterláncot fogad el, ellenben a print-tel, ami több dolgot is kaphat, és nem kell karakterláncnak lenniük, akkor is át lesznek konvertálva. Itt nekünk kell átkonvertálni, vagy a format-tal, ahogy a fenti példában, vagy az str konstruktorral, így valahogy:

l = [5, 6, 7]
 
fajl.write(str(l))

Másik fontos különbség, hogy a print automatikusan beszúr szóközöket az elemek közé, és újsorokat a sor végére, míg a write-nál mindkettőt nekünk kell megcsinálni. Az újsort a python karakterláncokban a "\n" jelképezi, mint látható a fenti példában.

A harmadik fontos különbség, hogy a write()-tal még nem vagyunk kész, mert technikai okok miatt nem mindig írja ki egyből a merevlemezre amit odaadtunk a write()-nak. A végén még le kell zárni a fájlt, ezzel jelezzük hogy kész vagyunk, most már mindent ténylegesen írjon ki. A close() metódus meghívásával tudjuk ezt megtenni, viszont miután ez megtörtént, utána már nem lehet írni a fájlba.

Ezt könnyű elfelejteni, és néha előfordulhat hogy nem felejtjük el, de a kódnak az a része ahol a close() van át lesz ugorva (mert egy break, vagy return vagy akár egy kivétel máshova ugrik a kódban), ezért van egy speciális szintaxis, ami azt jelenti hogy "a kód ezen a részen használom a fájlt, amikor ezt bárhogy elhagyom, zárjuk le". Ez a with kulcsszó, amit így kell használni (az előző példát módosítva):

with open("adatok.txt", "w") as fajl:
 
    muszer = Muszer()
 
    fajl.write(muszer.azonosito + "\n")
 
    for suly in muszer.sulyok():
        fajl.write("{:.6}\n".format(suly))
 
    fajl.write("--\n")
 
    for terfogat in muszer.terfogatok():
        fajl.write("{:.4}\n".format(terfogat))

Ajánlott a with használata mindig amikor lehet, ha fájlt nyitunk meg, akár írásra, akár olvasásra, mert egyszerűsíti a kódot, és így biztos használjuk amikor kell.

(Amúgy fájl olvasásnál is jó ha lezárjuk a fájlt így, vagy a close()-al, de kevésbé fontos, csak a hatékonyságon változtat. Hacsaknem több ezer fájlt megnyit a programunk, akkor ez a hatékonyság változás nem jelentős.)

Nagy HF

Részletek

Kitekintés

Ha szeretnétek a python-t tovább tanulni, és nem elfelejteni.

Magyarul

A python.hu-n található egy gyűjtemény a különböző magyar nyelvű anyagokról itt.

Sajnos nem sokan foglalkoznak ezzel, ezért sok ilyen magyar anyag elavult.

Van egy részleges fordítása a hivatalos python tutorial-nak, ami 2006-os és a python 2.4-es változatához készült (mi most a 2.7-est használjuk). (Amiatt viszont nem kell aggódni, hogy részleges, ami számotokra egyelőre fontos lehet, azt már mind lefedi.)

Ez a másik pdf oktatóanyag jónak néz ki első ránézésre, és legalább 2010-es, az már jóval közelebbi python a ma használthoz.

Angolul

Először is természetesen ott a hivatalos dokumentáció, aminek része a python tutorial, ami elég alapos, de talán kicsit túl száraz.

Elsődleges programozás tanulási ajánlat általában a www.codecademy.com, bár az ottani python tutorial nem sokkal fed le többet mint amit ebből a tárgyból megtanultunk, úgyhogy a továbbfejlődésre annyira nem jó, de ha esetleg 3-4 év múlva fel kell frissítenetek a tudásotok, akkor arra tökéletes lehet, nagyon barátságos kezelőfelülettel, és jól megalkotott feladatokkal.

Ha valaki hozzám hasonlóan szeret versengeni, akkor annak jó lehet valamilyen online programozó versenyen részt venni, én tudom ajánlani a TopCoder-t. Körülbelül heti rendszerességgel vannak versenyek, úgyhogy könnyű alkalmat találni, és egy verseny másfél óra, úgyhogy nem olyan nagy időbefektetés. Lehet python-t használni. 3 feladat van, és az első általában körülbelül olyan szinten van, vagy néha könnyebb, mint amiket itt laboron feladtam, úgyhogy már ennyi tanulás után is lehetnek sikerélményeitek valamennyire ott. A beadó rendszerük használata nem teljesen intuitív, most nem szánok 5-10 percet a kényelmes használat elmagyarázására (azért gondolom a többséget nem érdekli), ha valaki szeretne egy kis segítséget az elindulásban, dobjon egy emailt, és segítek.

Következő héttől C!

Személyes eszközök