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 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.

Most jól beolvasunk!” bejegyzéshez 29ozzá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

  3. 0028f-hez:
    A range második paraméterével megszenvedtem, mire rájöttem, hogy 0 esetén oda már nem jut el ;-), de végül csak rájöttem (hiába, no régen volt).
    A második ciklusba én bizony beleraktam mindkét kiírást, nem csináltam harmadikat, így függvényre sem volt szükség:

    lista = []

    forras = open(‘/tmp/szoveg.txt’,’r’)
    for sor in forras:
    lista.append(sor.strip())
    forras.close()

    cel = open(‘/tmp/masik.txt’,’w’)
    for c in range(len(lista)-1,-1,-1):
    print(lista[c])
    print(lista[c],file=cel)
    cel.close()

    Ui: Linuxos terminál ablakban nem szoktad használni a ctrl-l kombinációt? Nekem sokszor hiányzott a “sokkal tisztább, szárazabb” érzés. 😉

    Kedvelés

  4. :(((( help…. minden sikerült és ment, egy valamit kivéve….
    Többszöri próbálkozás után is 1 bájt lett a mérete annak a bizonyos 1 karakteres file-nak…. biztos elrontok valamit…. de vajon mit?????

    Kedvelés

    • Segíts egy picit, hol beszélek ilyet? Ha a videóban, adj időpontot. (rég volt már, és most nem érek rá (megtagadom a nevem:)) végignézni, mert rohanok a picimmel dokihoz, utána meg meló, utána meg kertásás, este zuttyanok majd gép mellé)

      Kedvelés

  5. Kösssszi!
    Miben próbálod? Lehet, hogy az a különbség, hogy a te szövegszerkesztőd nem tesz a végére _automatikusan_ egy LF-et (és esetleg egy CR-t), mint az enyém. Nyisd meg geany-ben, ahogy a videón látod, és elvileg neked nem is lesz ott az az LF. (Azért ide válaszolok, mert a WördPressz nem enged a te válaszodra válaszolni.)
    Futok ásni:Đ

    Kedvelés

    • Valóban nincs benne semmi más, megnéztem ezzel a geany-val. Egyébként sima notepad-em van win 8.1 alapfelszereltségéhez kaptam. Hogy lehet, hogy nekem semmit nem tesz a végére?
      (valamiért én sem tudok válaszolni a tiédre, nem engedi ez a fránya honlap 🙂 )

      Kedvelés

      • Szerintem Windows Jegyzettömbben mindig is úgy volt. Vigasztaljon a gondolat, hogy ha leütöd az Entert, rögtön 3 bájtos lesz a fájlod:)

        Kedvelés

  6. Szia,
    Bemásoltam jegyzettömbbe egy exceles tömböt, és amikor beletettem egy listába, akkor a .strip használata után is benne szerepelt a listában egy \t “szemét” minden egyes “oszlop”-nál. Ez a tab, de hogyan tudom ugyanúgy semmissé tenni, eltüntetni, mint a \n-et?

    Kedvelés

    • Erre is való a .split(). Ha megnézed a dokumentációját, látod, hogy beállítható, hogy mi mentén hasítston. Ez alapból, ha jól emlékszem, csak a space, de megadható a ‘\t’.

      Kedvelés

  7. Szia!
    A F0028h-hoz: jól látom, hogy a megoldás nem veszi figyelembe a nagy és a kisbetűk közötti különbséget? Az “Ez nem lesz neked kellemes, kedvesem.” sornál számíthat, mert szerintem az “E” betű is megfelel a feltételnek. A szóköztelenítőt egészíteném ki egy “sor = sor.lower()”-rel.
    És szerintem célszerűbb lenne a szóköztelenítőt is “if in mássalhangzók and in magánhangzók”-ra építeni, mert így a többi írásjelet és számokat is kiszűrné.
    Ha viszont nem kell ilyen általános megoldás, mert csak a konkrét szöveget vizsgáljuk, akkor elég lenne azt vizsgálni, hogy az adott betű ‘e’-e, vagy sem.

    PS: Nagyon-nagyon köszönöm, amit ezen az oldalon összehoztál 🙂
    PPS: Él még a bankszámlaszám?

    Kedvelés

    • Teljesen igazad van, az “Ez n” -t nem találja meg… Illetve alighanem a szóközteleíntés később jutott eszembe mint feladat többi része, ezért van, hogy nem kapcsolódik elég szervesen a megoldás többi részéhez – és akkor még enyhe voltam és nőies:) És igen, él.

      Kedvelés

  8. Szia ráérek!
    Az utolsó feladattal kapcsolatban nem vagyok bizos hogy jó-e,mer megnéztem a videód,de te máshogy csináltad és más jött ki nekem az eggyik sorban,ezért megszámoltam magam és szerintem jó de,szeretnék biztosra menni. https://pastebin.com/w7bkGr6R

    Kedvelés

    • Azt tutira jól látod, hogy az én programom a harmadik sor első E-jét nem veszi észre, mert az nagy E, és erre bizony nem figyeltem annak idején:) Úgy mehetsz tutira ilyenkor hogy kisbetűssé alakítod a sort, mielőtt foglalkozni kezdesz vele, és ez nálam kimaradt.

      Kedvelés

  9. Sziasztok! Az egyik érettségi feladatban beleütköztem egy olyanba, hogy a kiírt fájl neve változót kéne tartalmazzon. Azt hogyan tudom megoldani? Előre is köszönöm! 🙂

    Kedvelés

  10. 28.e igy is jo ?

    sourcefile = open(‘teszt.txt’, ‘r’)
    createdfile = open(‘teszt2.txt’, ‘w’)
    print(”.join(sourcefile), file=createdfile)
    sourcefile.close()
    createdfile.close()

    Kedvelés

Hozzászólás