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'
>>>
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
>>>
info_box
parametrin hline
.
Käytämme tätä parametria kolme kertaa.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
>>>
chomsky
vastaavista kentistä, koska ** -notaatio laventaa sanakirjan kentät funktionkutsussa
nimetyiksi parametreiksi.
format
-metodille annetun parametrin.