Szöveges állomány megnyitása, sorok olvasása

Szöveges állományt az open paranccsal nyithatunk meg, az alapértelmezett mód az olvasás. A létrejött objektum a .readline() metódussal megadja az első, azután rendre a következő sorok értékét:

>>> file= open('inf_e_20141017_m_04_foglaltsag.txt')
>>> line= file.readline()
>>> line
'xxoxoxoxoxoxooxxxxox\n'
>>> line= file.readline()
>>> line
'xxxxxxxxxxxxxxxxooox\n'

While-ciklus

Amint látjuk, a sorokat lezáró sorvégjel is része a beolvasott értéknek. Ennek megfelelően az üres(nek látszó) sor nem üres stringet ad; üres stringet az állomány végén kapunk. Ezt felhasználhatjuk az ismétlés lezárásához:

>>> file= open('inf_e_20141017_m_04_foglaltsag.txt')
>>> line= file.readline()
>>> while line != '':
...     line= file.readline()
... 

A fenti parancsok sok hasznot persze nem hajtanak, viszont megmutatják a python vezérlési szerkezeteinek egy fontos jellemzőjét: a ciklusfeltételt kettőspont zárja le, a ciklusmag sorai pedig (kötelezően) beljebb kezdődnek. A beljebbezés javasolt mértéke négy szóköz (lásd ehhez a python megfelelő ajánlását: PEP-0008.)

>>> file= open('inf_e_20141017_m_04_foglaltsag.txt')
>>> lst = []
>>> line= file.readline()
>>> while line != '':
...     lst = lst + [line]
...     line= file.readline()
... 
>>> lst
['xxoxoxoxoxoxooxxxxox\n', 'xxxxxxxxxxxxxxxxooox\n', 'xoxoxoxoxoxoxoxoxoxo\n',
 'ooxoxoxoxoxoxoxooxox\n', 'xxxxxxxxxxxxxxxxoooo\n', 'xxxxxxxxxxxxxxxxxxxx\n',
 'oooooooooooooooooooo\n', 'xxxxxxxxxxooxxxxxxxx\n', 'xooxxxxxxxxxoxxxxxoo\n',
 'xxxxxxoxxxxxxxoxxooo\n', 'xooooooooxoooooooxxx\n', 'ooooooxoxoxoxoxoxoxo\n',
 'oxxxxxxxxxxxxxxxxxoo\n', 'xxxxxxxxxxxxooooooox\n', 'oxxxxxxxxxxxxxoooooo\n']

A parancssorban a ciklusmagot egy üres sor zárta le, ezt követően (azaz az ismétlés befejeződése után) írathattuk ki az lst változó értékét. (Ennek kimenete a jobb olvashatóság érdekében áttördelve.)

Láthatjuk, hogy összetett struktúrákat is felépíthetünk a paracssorban, de ez még a felfelé mutató nyíllal elérhető parancssori ismétlés lehetőségeit kihasználva is hamarosan igen nehézkessé válnék, ezért e ponton elkezdünk programokat írni.

Más nyelvek hasonló szerepű += konstrukcióját itt felhasználhatjuk a listához való hozzáfűzéshez (is):

print('1. feladat')
print('A foglaltsag.txt állomány adatainak olvasása…')
file= open('inf_e_20141017_m_04_foglaltsag.txt')
lst = []
line= file.readline()
while line != '':
    lst+= [line]
    line= file.readline()
print(lst)

Két állomány adatainak olvasásához értelemszerűen új változóneveket használva, s a bemeneti állományok sorvégjeleit levágva:

print('1. feladat')

print('A foglaltsag.txt állomány adatainak olvasása…')
file  = open('inf_e_20141017_m_04_foglaltsag.txt')
l_fogl= []
line  = file.readline()
while line != '':
    l_fogl+= [line[:-1]]
    line   = file.readline()

print('A kategoria.txt állomány adatainak olvasása…')
file  = open('inf_e_20141017_m_04_kategoria.txt')
l_kat = []
line  = file.readline()
while line != '':
    l_kat += [line[:-1]]
    line   = file.readline()

#print (l_fogl, l_kat)

Feltételeztük, hogy a bemeneti állomány minden sorát \n zárja le. Elképzelhető, hogy ez az utolsó sor esetén hiányzik – ilyen esetben természetesen óvatosabbnak kell lennünk az utolsó karakter levágásával.

A megnyitott állományokat illő lett volna lezárnunk, ezt megtehetjük a file.close() utasítással (erre a kérdésre azonban később visszatérünk még).

A # megjegyzést vezet be: az adott helyen nem kell kiíratnunk a változók értékét, de ez nyilván sokszor lehet hasznos a program tesztelése során.