Szöveges dokumentumok
Szöveges dokumentumba írás
Változók segítségével megjegyezhetünk információkat a program futása alatt. Ha az információkat egy fájlba mentjük el, később is használhatjuk őket, mikor újraindítjuk a programunkat. Megmutatjuk hogyan lehet legegyszerűbben használni a szöveges dokumentumot.

A fajl = open('pontok.txt', 'w') utasítással a fajl változóba (lehet más neve is) megnyitjuk a pontok.txt szöveges dokumentumot írásra. A fajl.write(karakterlánc) utasítással a dokumnetumba tudjuk írni a megadott karakterláncot. A dokumentum helyes bezárására a fajl.close() utasítást használjuk. A bezárással megszűnik az összeköttetés a dokumentum és a változó között. Ha nem zárjuk be a dokumentumot, előfordulhat, hogy a program bezárása után nem lesz minden változás elmentve a dokumentumban. Ha a megnyitandó fájl még nem létezik, a Python létrehoz egyet, ha már létezik, akkor kitörli annak tartalmát. Ha nem határozzuk meg külön, hol legyen ez a fájl, akkor a Python a programunk mappájában kell keresnünk.
Ha megnyitjuk az előbb létrehozott dokumentumot, akkor láthatjuk, hogy többször használtuk a write utasítást és mindent egy sorba írt a program. Az új sort a '\n' jellel írhatjuk le. Akár egyetlen write utasítással is írhatunk több sorba.

Kérdések
1. Mit tartalmaz a teszt.txt dokumentum?
2. Egy programot szeretnénk készíteni, amely szöveges dokumentumot hoz létre, amiben a sorok meg vannak számozva 1-től 9-ig. Az alábbi kódok közül melyik lesz megfelelő? A többiben keressétek meg a hibát!
fajl = open('teszt.txt', 'w')
for i in range(1, 10):
fajl.write(i)
fajl.close()
----------------------------------------------------------
fajl = open('teszt.txt', 'w')
for i in range(1, 10):
fajl.write(i+'\n')
fajl.close()
----------------------------------------------------------
fajl = open('teszt.txt', 'w')
for i in range(1, 10):
fajl.write(str(i))
fajl.write('\n')
fajl.close()
----------------------------------------------------------
for i in range(1, 10):
fajl = open('teszt.txt', 'w')
fajl.write(str(i)+'\n')
fajl.close()
Az írásra megnyitott dokumentumba a print utasítással is írhatunk, ami alapjában a shellbe ír, de paraméterként megadhatjuk, melyik állományba írjon.
fajl = open('teszt.txt', 'w')
for i in range(1, 10):
print(i, file=fajl)
fajl.close()
Sorok hozzáadása a dokumentumhoz
Szöveges dokumentumot 'a' paraméterrel is megnyithatunk: fajl = open('tesz.txt', 'a'). Így módosításra nyitjuk meg, vagyis ha a dokumentumban már volt valami elmentve, az nem törlődik, hanem írhatunk bele új sorokat a régiek után.
A következő program bekéri a felhasználó nevét és korát, amiket beír egy dokumentumba. Minden futtatással újabb sorokkal bővül majd a dokumentum.

Készítünk egy programot, amely üzeneteket ment el egy dokumentumban. Ha üzenet helyett a 'delete' szöveget adjuk meg, akkor kitörli az eddigi üzeneteket.

Olvasás szöveges dokumentumból
Hasonlóan mint az írásnál az olvasásnál is előbb meg kell nyitnunk az állományt. Erre szolgál az 'r' paraméter (a 'w' és 'a' helyett). fajl=open('nev.txt', 'a')
Ha nem adunk meg paramétert, akkor az állomány automatikusan olvasásra nyílik meg. Vigyázat, olvasásra való megnyitáskor a dokumentumnak már léteznie kell! Egyébként a Python hibát jelez. Problémák merülhetnek fel a különböző karakterkódolásoknál is. Néha meg kell adnunk a használt kódolást. Ezt az encoding paraméterrel tehetjük meg:
fajl = open('allomany.txt', 'r', encoding='kódolás')
A kódolás lehet: 'utf-8', 'cp1250', 'iso88591'. Készítsünk egy szöveges állományt például jegyzettömb segítségével:

Az állomány egy teljes sorát a sor = fajl.readline() utasítással olvashatjuk be. Nem mindig kell a beolvasott sort egy változóhoz hozzárendelni, néha elég paraméterként használni egy utasításhoz: print(fajl.readline()). Amikor megnyitunk egy szöveges dokumentumot a Jegyzettömbben, nem látjuk a sorok végi karaktert ('\n'), de beolvasáskor ezt a karaktert is beolvassuk. A beolvasás után is célszerű bezárni a dokumentumot.
Ha kiíratásnál szeretnénk látni minden karaktert (a láthatatlanokat is), akkor használjuk a repr(karakterlánc) utasítást.

Ha tudjuk, hogy pontosan mennyi sort kell beolvasnunk, akkor használhatunk erre a beolvasásra for ciklust. Gyakrabban fordul elő, hogy előre nem tudjuk, mennyi sorból áll a dokumentum, ekkor így olvashatjuk be őket:

Egy másik módja a beolvasásnak időzítő segítségével. Addig folytatja a beolvasást és kiírást, amíg üres sort nem talál:

Beolvasásnál nem tudunk csak egy megadott sort beolvasni. Fokozatosan kell eljutnunk a kívánt sorig.
Egy ciklussal megszámolhatjuk, mennyi sorból áll a dokumentumunk. Ezután újra megnyitjuk az állományt, de csak a kívánt sorig fogjuk olvasni.

A dokumentumot nem kell többször beolvasni, ha elraktározzuk egy változóban, vagy egy adatszerkezetben. Viszont nem mindig tudjuk, milyen nagy állománnyal kell dolgoznunk. A memória mérete jóval kisebb mint a merevlemez mérete (amin az állományt alapból tároljuk), ezért könnyen előfordulhat, hogy a kezelt dokumentum mérete is nagyobb lesz. De ha elraktározzuk a memóriában a dokumentum tartalmát, akkor sokkal gyorsabban hozzáférhetünk, mintha mindig újra be kellene olvasni bizonyos adatokért. A következő program beolvassa a dokumentum sorait egy tuple-be. Majd a megadott szám alapján a megfelelő indexű elemet írja ki:

Látjuk a shell-ben, hogy a sorok továbbra is tartalmazzák a sorvégi '\n' karaktert is. Megszabadulhatunk tőle a sor.strip() metódussal, ami a sor eleji és végi szóközöket is eltünteti.
Szöveges dokumentum olvasásának egyéb módjai
Ciklus feltétellel (while ciklus)
Az előző fejezetben megmutattuk, hogy lehet időzítő segítségével beolvasni egy állomány tartalmát. Egy feltétel mondta meg, hogy folytassuk-e a beolvasást, vagy ha üres sort találtunk, akkor álljon le.
A while ciklust elöltesztelős ciklusnak is hívják.

Kérdések
1. Mit fog csinálni a következő program? Hányszor fut le a while ciklus? Előfordulhat, hogy egyszer sem?
from random import *
ossz = 0
print('Az összeg ' + str(ossz))
while ossz < 30:
szam = randrange(10)
print('A következő szám ' + str(szam))
ossz + = szam
print('Az összeg ' + str(ossz))
2. Mit fog csinálni a következő program? Hányszor fut le a while ciklus? Milyen körülmények között jelent hibát a Python?
ossz = 0
mennyi = 0
jegy = int(input('Add meg a jegyet! '))
while 0 < jegy < 6:
mennyi += 1
ossz += jegy
jegy = int(input('Add meg a jegyet! '))
print('Megadott jegyek száma: ' + str(mennyi))
print('A jegyek átlaga:', ossz/mennyi)
3. Mit fog csinálni a következő program? Hányszor fut le a while ciklus?
from random import *
jegy = randrange(1, 6)
mennyi = 0
ossz = 0
while jegy < 6:
mennyi += 1
ossz += jegy
print('Következő jegy: ' + str(jegy))
print('Jegyek aktuális mennyisége: ' + str(mennyi))
jegy = randrange(1, 6)
print('Megadott jegyek száma: ' + str(mennyi))
print('Jegyek átlaga:', ossz/mennyi)
4. A while ciklus milyen körülmények között
a) nem fut le egyszer sem?
b) soha nem áll le?
A with szerkezet
A szöveges dokumentumokkal való munka során találkozhatunk a with szerkezettel is. Ennél a szerkezetnél nem szükséges bezárni a dokumentumot, a Python automatikusan bezárja, ha a szerkezet végére ért. Minden utasítás, ami a with után beljebb kezdődik, a szerkezethez tartozik.

Több állomány használata
Egy megnyitott szöveges dokumentumban az egyes sorokat nem lehet megváltoztatni. Viszont megnyithatunk két különböző állományt - az egyiket olvasásra, a másikat írásra.

Hogy a programunk melyik állománnyal dolgozzon, azt bekérhetjük a felhasználótól is:
nev = input('Melyik állományt nyissam meg? ')
bemenet = open(nev, 'r')