Állományok olvasása III. – .split()

A szöveg típusú változók (stringobjektumok) .split() metódusa a szóközök és sorvégjelek (valamint –alapértelmezés szerint– néhány további karakter) mentén felhasogatja a stringet, s a kapott darabokat egy listában adja vissza (a kimenet áttördelve és megkurtítva):

>>> file= open('inf_e_20050519_m_04_lottosz.dat')
>>> lst = file.readlines()
>>> lst
['37 42 44 61 62\n', '18 42 54 83 89\n',  '5 12 31 53 60\n',
  '1 28 47 56 70\n', '54 56 57 59 71\n',  '7 21 33 39 86\n',
…
 '12 28 34 61 70\n',    '1 4 8 69 74\n',  '4 15 46 49 59\n',
 '24 31 67 71 73\n', '12 26 36 46 49\n',  '9 20 21 59 68']
>>> for i in range(len(lst)):
...     lst[i]= lst[i].split()
... 
>>> lst
[['37', '42', '44', '61', '62'], ['18', '42', '54', '83', '89'],  ['5', '12', '31', '53', '60'],
  ['1', '28', '47', '56', '70'], ['54', '56', '57', '59', '71'],  ['7', '21', '33', '39', '86'],
…
 ['12', '28', '34', '61', '70'],    ['1', '4', '8', '69', '74'],  ['4', '15', '46', '49', '59'],
 ['24', '31', '67', '71', '73'], ['12', '26', '36', '46', '49'],  ['9', '20', '21', '59', '68']]

Vegyük észre, hogy ez a metódus is levágja a sorvégjeleket.

Az előző ciklus helyett is írhatunk rövidebbet egyetlen sorba, indexek nélkül:

>>> file= open('inf_e_20050519_m_04_lottosz.dat')
>>> lst = file.readlines()
>>> lst = [line.split() for line in lst]

Vagy tömörebben leírva:

>>> lst= [line.split() for line in open('inf_e_20050519_m_04_lottosz.dat')]
>>> lst
[['37', '42', '44', '61', '62'], ['18', '42', '54', '83', '89'],  ['5', '12', '31', '53', '60'],
  ['1', '28', '47', '56', '70'], ['54', '56', '57', '59', '71'],  ['7', '21', '33', '39', '86'],
…
 ['12', '28', '34', '61', '70'],    ['1', '4', '8', '69', '74'],  ['4', '15', '46', '49', '59'],
 ['24', '31', '67', '71', '73'], ['12', '26', '36', '46', '49'],  ['9', '20', '21', '59', '68']]

A hasogatás után kapott stringeket számmá konvertálva:

>>> file= open('inf_e_20050519_m_04_lottosz.dat')
>>> lst = file.readlines()
>>> lst = [[int(str) for str in line.split()] for line in lst]

Vagy tömörebben leírva:

>>> lst= [[int(str) for str in line.split()] for line in open('inf_e_20050519_m_04_lottosz.dat')]
>>> lst
[[37, 42, 44, 61, 62], [18, 42, 54, 83, 89],  [5, 12, 31, 53, 60],
  [1, 28, 47, 56, 70], [54, 56, 57, 59, 71],  [7, 21, 33, 39, 86],
…
 [12, 28, 34, 61, 70],    [1, 4, 8, 69, 74],  [4, 15, 46, 49, 59],
 [24, 31, 67, 71, 73], [12, 26, 36, 46, 49],  [9, 20, 21, 59, 68]]

A fenti lista kezdő eleme értelemszerűen egy lista, melynek kezdő eleme egy szám:

>>> lst[0]
[37, 42, 44, 61, 62]
>>> lst[0][0]
37

Ezek után a Lottó című feladat 4. lépése (inf_e_20050519_m_04):

print('4. feladat')

wno= int(input('Kérek egy egész számot 1 és 51 között: '))
print('A(z) ', wno, '. hét lottószámai: ', sep= '', end= '')
for val in lst[wno-1]:
    print(val, end= ' ')
print()

Gyakorló feladatok

  • inf_e_20050519_m_04_03 (Lottó): beolvasás hagyományos stílusban, két egymásba ágyazott ciklussal
  • inf_e_20090515_i_04_01 (Automata): két állományt olvasunk, értelemszerűen két listát készítünk, a fölösleges első sort beolvassuk, majd eldobjuk
  • inf_e_20090515_m_04_01 (Lift): a három kezdő sor szerkezete eltérő, bennük érdemi információ
  • inf_e_20100511_i_04_01 (Telek): a fölösleges első sort beolvassuk, majd eldobjuk; a belső ciklust egysoros, listaépítő ciklussal helyettesítjük
  • inf_e_20100511_m_04_01 (Helyjegy): a többivel azonos szerkezetű, de más tartalmú első sort másképp dolgozzuk föl, mint a következőket
  • inf_e_20120514_m_04_01 (Futár): a külső ciklust is beépítjük a listaépítő szerkezetbe
  • inf_e_20121019_m_04_01 (Szín-kép): az egész beolvasás egyetlen sorba tömörítve