Ohjelmoinnin peruskurssi Y2, kurssimateriaali

4.2. Tulostus tekstitiedostoon

«  4.1. Tiedostojen kirjoittaminen ja lukeminen   ::   Etusivulle   ::   4.3. Läpikäynnit, iteraattorit, generaattorit  »

4.2. Tulostus tekstitiedostoon

Tulostus tekstitiedostoon tapahtuu samaan tapaan kuin aiemmin tekstikonsolille print-funktiolla.

Tulostustiedosto avataan open-funktiolla ja tulostamiseen voimme käyttää joko print-funktiota tai tulostusvirran metodia `write <>`_.

with open('out.txt', mode='w') as f:
    f.write('Tulostetaan numero {}\n'.format(10))
    print('Tulostetaan numero {}'.format(10), file=f)

Merkkijonojen muotoilu tulostusta varten

Tulostuksen yhteydessä tarvitaan usein muotoiltuja merkkijonoja ja Python tarjoaa useita tapoja niiden tekemiseen.

Suoraviivaisin tapa on liimailla haluttu lopputulos palasista käyttäen + -operaattoria. Jos käytetään muita kuin merkkijonoja, pitää ne konvertoida esim. str -funktiolla merkkijonoiksi. Esimerkiksi näin:

>>> nimi = "Maija Metso"
>>> ika = 37
>>> asema = "Johtaja"
>>>
>>> print(nimi + " " + str(ika) + ", " + asema)
Maija Metso 37, Johtaja

Tämä on toki täysin kelvollinen tapa muotoilla merkkijonoja, mutta +-merkkejä ja str -kutsuja tulee helposti runsaasti. Muotoilulausekkeista on tällöin vaikea ilman ohjelman suorittamista nähdä, millaisia merkkijonoja ollaan tekemässä.

Parempi on kuitenkin käyttää valmista metodia str.format, jolla saa hienostuneita ulkoasuja pienellä vaivalla. Käsittelemme sitä tarkemmin luvussa Merkkijonojen muotoilu metodilla str.format.

Merkkijonojen muodostaminen metodilla str.format

Pythonissa on tarjolla sangen monipuolinen merkkijonojen muotoilumetodi str.format. Tarjolla olevia muotoilumäärityksiä kuvataan tarkemmin The Python Standard Libraryn luvussa 6.1.3. Format String Syntax, johon kannattaa tutustua. Käydään tässä läpi muutamia keskeisiä rakenteita.

Annetut parametrit voi suoraviivaisesti lisätä oikeisiin kohtiin merkkijonossa käyttäen merkintää {}.

>>> s='Arvot ovat {}, {} ja {}'.format('a', 1, True)
>>> s
'Arvot ovat a, 1 ja True'
>>>
Merkintä {} poimii järjestyksessä seuraavan format -metodille annetun parametrin.

Tämä ei kuitenkaan ole näppärää, jos haluamme toistaa saman parametrin moneen kertaan. Lisäämällä numeron aaltosulkujen väliin, voimme käyttää samoja parametreja useita kertoja ja mielivaltaisessa järjestyksessä. Esim.

>>> def info_box(mother, father, hline, nl):
...     print('{2}{3}Mother: {0}{3}{2}{3}Father: {1}{3}{2}'.format(mother, father, hline, nl))
...
>>>
>>> info_box('Virpi Varpunen', 'Keijo Kotka', 22 * '-', '\n')
----------------------
Mother: Virpi Varpunen
----------------------
Father: Keijo Kotka
----------------------
>>> info_box('Teea Tilhi', 'Pertti Pääskynen', '', '\n')

Mother: Teea Tilhi

Father: Pertti Pääskynen

>>>
Merkintä {2} poimii formatin toisen parametrin (numerointi alkaa nollasta), eli funktion info_box parametrin hline. Käytämme tätä parametria kolme kertaa.
Funktion info_box parametria nl käytämme rivierotimena. Annamme tämän formatille kolmantena parametrina ja käytämme sitä formatin merkkijonossa peräti neljä kertaa.

Numeroitujen parametrien käyttö on kuitenkin hieman hankalaa, koska koko ajan pitää laskeskella, missä indeksissä mikäkin parametri oli. Helpompaa voi olla käyttää nimettyjä parametreja:

>>> print('People claim that {firstname} {lastname} answers to all email sent to {email}'
... .format(firstname='Noam', lastname='Chomsky', email='chomsky@mit.edu'))
People claim that Noam Chomsky answers to all email sent to chomsky@mit.edu
>>>
>>> # Tai käyttäen dict-oliota
>>> chomsky={'firstname': 'Noam', 'lastname': 'Chomsky', 'email': 'chomsky@mit.edu'}
>>> print('People claim that {firstname} {lastname} answers to all email sent to {email}'.format(**chomsky))
People claim that Noam Chomsky answers to all email sent to chomsky@mit.edu
>>>
Nimetty parametri 'firstname'.
Nimetyt parametrit otetaan sanakirjan chomsky vastaavista kentistä, koska ** -notaatio laventaa sanakirjan kentät funktionkutsussa nimetyiksi parametreiksi.

«  4.1. Tiedostojen kirjoittaminen ja lukeminen   ::   Etusivulle   ::   4.3. Läpikäynnit, iteraattorit, generaattorit  »