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:
- 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.
- 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.
- 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??
- 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.)
- 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()
- 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()
- 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()
- 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()
- 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.
28a: működik így is (idézőjelek között egy szóköz):
print(sor.strip(), end = ‘ ‘)
KedvelésKedvelés
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ésKedvelés
Lehet, hogy rá fogok:) Melyik feladatra leszel a legkíváncsibb?
KedvelésKedvelé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ésKedvelé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ésKedvelés
Lekötelezel ! 😀
Köszönöm a gyors segítséget !:)
KedvelésKedvelés
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ésKedvelés
De:) Pont az a feladat, hogy ne tárold el a bemenetet, és te eltárolod.
KedvelésKedvelés
Köszönöm, ezt elnéztem, így tényleg csak bejárós ciklussal jó. Köszönöm a választ!
KedvelésKedvelés
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ésKedvelés
Nem szoktam, mert nem ismertem:) No, majd mostantól! Thx.
KedvelésKedvelés
:(((( 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ésKedvelé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ésKedvelés
Egészen pontosan 2:28 -nál van az a rész. 🙂
KedvelésKedvelés
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ésKedvelé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ésKedvelé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ésKedvelés
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ésKedvelé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ésKedvelés
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ésKedvelé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ésKedvelés
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ésKedvelé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ésKedvelés
Köszönöm 😀
KedvelésKedvelés
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ésKedvelés
Erre gondolsz?
változó = ‘lami’
forrásfájl = open(‘va’+változó+’.txt’)
for sor in forrásfájl:
print(sor)
KedvelésKedvelés
Igen, erre, köszönöm a segítséget!
KedvelésKedvelés
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ésKedvelés
Óóó, igen:)
KedvelésKedvelés