Most jól beolvasunk!

Mármint fájlokat. Szövegfájlokat. Meg kiírni is fogunk ám.

Szóval az úgy van, hogy egészen eddig mindig mi töltöttük fel adatokkal a programunkat, illetve néha a program maga szülte meg az adatokat. Hát ennek vége!

Lássuk az iszonyhosszú videót! Tényleg, picit hosszabb, mint 25 perc tömény tananyag, jól gondold át… :Đ Na, esetleg egy videóklippet előtte?:)

Tanulságok:

  1. A szövegfájlt az open() függvénnyel nyitjuk meg. A függvénynek két paraméterével ismerkedtünk:
    • a fájl neve, ez kötelező
    • az, hogy olvasásra (r, mint read), írásra (w, mint write), vagy hozzáfűzésre (a, mint append) nyitjuk meg a fájlt

    A második paraméter elhagyható, és ha elhagyjuk, az olyan, mint ha r betűt írtunk volna oda, azaz olvasásra nyílik meg a fájl. A w és az a mód között az a különbség, hogy már létező fájl esetén a w egy újjal felülírja a régit, az a meg folytatja a régit a végénél. A függvény ennél bonyolultabb, lassan úgy is érdemes ismerkedned az online dokumentációval, hát nesze.

  2. A bemutatott módszer a Windows Jegyzettömbben mentett fájlokat alapból nem kezeli helyesen, mert azok Windows-1250 kódolásúak. Notepad++-ban ezt tudod állítani. Természetesen a Pythonnak is lehet szólni a helyzetről, de ezzel mi most még egy jó darabig nem foglalkozunk, elvagyunk ékezet nélküli szövegekkel.
  3. A szövegfájlok sorait
    • Linuxon LF, azaz LineFeed, azaz soremelés, azaz \n zárja
    • Windows-on CRLF, azaz CarriageReturn és LineFeed, azaz kocsivissza és soremelés, azaz \r\n zárja
    • szerencsére a beolvasott sorok karakterlánc típusúak és a karakterlánc típusnak van egy strip() tagfüggvénye, ami történetesen pont segít ezt a problémát megoldani. Dani? Milyen Dani? Ki a harag az a Dani??
  4. A fájlokat illik a close() tagfüggvénnyel bezárni használat után. A programod futásának végén automatkusan záródnak, ha addig nem tetted volna ezt meg.

Olvasás fájlból

Négy módszert tekintettünk át, ami valójában öt. (Megjegyzem, hogy érdemes volna még kitérni a with parancsra, de most nem fogunk, mert majd egyszer később.)

  1. Beolvasás soronként, a beolvasott sorokról lepucoljuk a sorvége-jeleket, és a fájlt soronként egy listába töltjük:
    lista = [] #üres lista
    forrásfájl = open('szoveg.txt')
    for sor in forrásfájl:
        # a sorról levesszük a sorvégét, majd a lista végére fűzzük
        lista.append(sor.strip())
    forrásfájl.close()
    
  2. Beolvasás egyben, a sorok egy listába kerülnek, a lista tagjainak a végeiről szedjük le a sorvégeket:
    forrásfájl = open('szoveg.txt')
    lista = forrásfájl.readlines()
    lista_végek_nélkül = []
    for elem in lista:
        lista_végek_nélkül.append(elem.strip())
    forrásfájl.close()
    
  3. Beolvasás egyben, az egész fájl egy változóba kerül (ritkán használjuk, igazából az 5. módszer előtanulmányaként foglalkozunk vele):
    forrásfájl = open('szoveg.txt')
    tartalom = forrásfájl.read()
    forrásfájl.close()
    
  4. Beolvasás soronként, a sorokkal csinálunk, amit akarunk. A fájl végére érve befejezhetjük a beolvasást, vagy várhatunk arra, hogy megnő a fájl, mert egy másik program beleír. Olyankor lehet hasznos, ha borzasztó hosszú a fájl. Alapesetben ezt a helyzetet kezeli az első megoldás is, ha a listába pakolás helyett csak megcsináljuk a sorral, amit kell. Igazából az 5. módszer az 5. módszer előtanulmányaként foglalkozunk vele:
    forrásfájl = open('szoveg.txt')
    while True: #végtelen ciklus, amiből majd kiugrunk
        sor = forrásfájl.readline()
        if sor: #ha még nem vagyunk a fájl végén, értelmezését lásd a videóban
            csinálunk_vele_valamit()
        else: #elhagyható, felhasználását lásd a videóban
            break
    forrásfájl.close()
    
  5. Beolvasás karakterenként, hasonló helyzetekben kellhet, mint amit a 4. módszernél írtam:
    forrásfájl = open('szoveg.txt')
    while True: #végtelen ciklus, amiből majd kiugrunk
        betű = forrásfájl.read(1)
        if betű: #ha még nem vagyunk a fájl végén, értelmezését lásd a videóban
            csinálunk_vele_valamit()
        else: #elhagyható, felhasználását lásd a videóban
            break
    forrásfájl.close()
    

Írás fájlba

Az open() függvénnyel a fájlt w vagy a módban nyitjuk meg. A print() függvénynek ismerjük meg egy elhagyható paraméterét, a file nevűt. Ha elhagyjuk, akkor a paraméter alapértelmezett értéke fog számítani. Ez az érték a sys.stdout, azaz a rendszer (system, sys), standard kimenete (standard output, stdout), ami Windows-on a parancssori ablak, Linuxon a terminál.

lista = ['alma', 'körte', 'pöffeteg']
célfájl = open('szoveg.txt', 'w') #vagy 'a'
for elem in lista:
    print(elem, file=célfájl)
célfájl.close()

Feladatok

Írj magadnak egy szövegfájlt Jegyzettömbben, vagy más egyszerű szövegszerkesztőben, benne ezzel a tartalommal:

Egyszer
volt,
hol
nem
volt,
volt
egyszer
egy
ember.

F0028a: Olvasd be a fájlt, és írd ki a tartalmát egy sorba, úgy, hogy nem tárolod el a szöveget, hanem minden sort azonnal kiírsz! (Megoldás itt.)

F0028b: Olvasd be a fájlt, tárold a sorokat listában, majd írd ki a lista tartalmát egy sorban! (Megoldás itt.)

F0028c: Olvasd be a fájlt, tárold a sorokat listában, majd írd ki a lista tartalmát egy sorként egy másik fájlba! (Megoldás itt.)

F0028d: Olvasd be a fájlt, tárold a sorokat listában, majd írd ki a lista tartalmát így, ahogy beolvastad, soronként egy szóval egy másik fájlba! (Megoldás itt.)

F0028e: Olvasd be a fájlt, és írd ki a tartalmát egy másik fájlba, úgy, hogy nem tárolod el a szöveget, hanem minden sort azonnal kiírsz! (Megoldás itt.)

A következő feladatban ezzel a fájllal dolgozunk (egy sorban egy mondat van, ha másképp töri a böngésződ, akkor alakítsd át!):

Kenyeret ettem meggyel.
Rengeteg ember hever eme kereveteken.
Ez nem lesz neked kellemes, kedvesem.
E rettenetes fecske ereje szellemes.

F0028f: Olvasd be a fájlt és írd ki a sorait fordított sorrendben, a képernyőre csakúgy, mint egy fájlba! (Megoldás itt.)

F0028g: Az E és az e betűt a cenzúra betiltotta. Írd ki a szöveget úgy, hogy helyettük csillagot írsz! A végére írd ki, hogy hány E és hány e betűt helyettesítettél csillaggal! (Megoldás itt.)

F0028h: Olvasd be soronként a fájlt, és egy függvénnyel állapítsd meg, hogy hány olyan magánhangzó van az adott sorban, ami után legalább két mássalhangzó van! Írj olyan változatot is, ami nem veszi figyelembe, ha a két mássalhangzó között szóközt találsz! (Megoldás itt.)

Az előző alkalommal megismerkedtünk a függvényekkel. Legközelebb több dimenziós listákkal nyomulunk.

Reklámok

Most jól beolvasunk!” bejegyzéshez ozzászólás

  1. Szia Raerek!
    Hétfőn érettségi ! Esetleg tudnál valamilyen segítséget adni a beolvasásokhoz érettségi példán keresztül ?
    Vicces, de tényleg a legnagyobb probléma. Nem megy zökkenőmentesen.
    Persze ,csak ha ráérsz..

    Kedvelés

      • Bárminek amit kapok örülni fogok. Nem igazán találtam a neten megoldottakat. A tavalyi májusi tökéletes lenne. 🙂

        Kedvelés

      • Hát parancsolj:) Teszteltem, működik.

        vásárlások = [] #ebbe kerül a teljes fájl tartalma, 2D lista lesz
        forrásfájl = open(‘penztar.txt’)
        vásárlás = [] #ebben fogjuk tartani azt, amit egy vásárló vesz, 1D lista lesz
        for sor in forrásfájl:
        if sor.strip() != ‘F’: #ha most nem fizet, azaz épp vesz valamit
        vásárlás.append(sor.strip()) #akkor azt beírjuk az ő vásárlásit tartalmazó listába
        else: #ha épp most fizet, azaz befejezte a vásárlást
        vásárlások.append(vásárlás) #akkor amit ő vett, azt beírjuk az összes vásárláshoz
        vásárlás = [] #kinullázzuk az egy vevő vásárlásait nyilvántartó 1D listát
        forrásfájl.close()
        print(vásárlások)

        Kedvelés

  2. A 28e-hez ugye az sem “csúnya” megoldás, ha a .read() tagfüggvénnyel az egészet beolvastatom egy objektumba, majd az objektumot így egy az egyben beleíratom a célfájlba (szóval a 3. típusú beolvasás)?

    Kedvelés

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s