Kirjautuminen

Haku

Tehtävät

Oppaat: Python-ohjelmointi: Osa 9 - Standardikirjasto

  1. Osa 1 - Ensimmäinen ohjelma
  2. Osa 2 - Tiedon käsittely
  3. Osa 3 - Ehtorakenteet
  4. Osa 4 - Toistorakenteet
  5. Osa 5 - Listojen käsittely
  6. Osa 6 - Merkkijonot
  7. Osa 7 - Omat funktiot
  8. Osa 8 - Tiedostot ja virheet
  9. Osa 9 - Standardikirjasto
  10. Osa 10 - Tietorakenteet
  11. Osa 11 - Alkeita edemmäs
  12. Osa 12 - Yhteenveto
  13. Liite 1 - Asennus ja käyttö

Kirjoittaja: Antti Laaksonen (2015).

Python-kielen osana on laaja standardikirjasto, joka muodostuu kokoelmasta moduuleita eri tarkoituksiin. Esimerkiksi moduuli math sisältää matemaattisia funktioita, moduulin datetime avulla voi käsitellä päivämääriä ja kellonaikoja ja moduulin urllib kautta pystyy hakemaan tietoa Internetistä.

Tässä oppassa on joukko esimerkkejä standardikirjaston moduulien käytöstä. Ohjelmoijan ei tarvitse muistaa moduulien sisältöä ulkoa, vaan riittää tietää, mistä voi etsiä tietoa niistä. Seuraavassa osoitteessa on täydellinen luettelo standardikirjaston moduuleista:

http://docs.python.org/library/

Ohjelman käyttämät moduulit täytyy luetella sanan import jälkeen ohjelman alussa. Esimerkiksi jos ohjelma käyttää moduuleita math ja datetime, tästä täytyy ilmoittaa seuraavasti ohjelman alussa:

import math
import datetime

Matematiikka

Moduulissa math on matemaattisia funktioita.

Seuraava ohjelma laskee lukujen 0–9 neliöjuuret:

import math
for i in range(0, 10):
    print("Luvun", i, "neliöjuuri on", math.sqrt(i))

Ohjelman tulostus on seuraava:

Luvun 0 neliöjuuri on 0.0
Luvun 1 neliöjuuri on 1.0
Luvun 2 neliöjuuri on 1.41421356237
Luvun 3 neliöjuuri on 1.73205080757
Luvun 4 neliöjuuri on 2.0
Luvun 5 neliöjuuri on 2.2360679775
Luvun 6 neliöjuuri on 2.44948974278
Luvun 7 neliöjuuri on 2.64575131106
Luvun 8 neliöjuuri on 2.82842712475
Luvun 9 neliöjuuri on 3.0

Satunnaisluvut

Moduulin random avulla voi käsitellä satunnaislukuja.

Seuraava ohjelma arpoo kymmenen kertaa nopan silmäluvun:

import random
print("Kymmenen nopanheittoa:")
for i in range(0, 10):
    print(random.randint(1, 6), end = ", ")

Ohjelman tulostus voi olla seuraava:

Kymmenen nopanheittoa:
1, 4, 5, 5, 5, 2, 4, 3, 2, 6,

Seuraava ohjelma sekoittaa tiedostonimien listan:

import random
lista = ["a.mp3", "b.mp3", "c.mp3", "d.mp3", "e.mp3"]
random.shuffle(lista)
print("Soittolista:")
for kappale in lista:
    print(kappale)

Ohjelman tulostus voi olla seuraava:

Soittolista:
a.mp3
e.mp3
c.mp3
d.mp3
b.mp3

Järjestelmän aika

Moduulin datetime avulla voi käsitellä päivämääriä ja kellonaikoja.

Seuraava ohjelma tulostaa järjestelmän päivämäärän ja kellonajan:

import datetime
aika = datetime.datetime.now()
print(aika.strftime("%d.%m.%Y %H:%M:%S"))

Ohjelman tulostus voi olla seuraava:

14.10.2015 22:34:48

Seuraava ohjelma tulostaa ajan osat yksitellen:

import datetime
aika = datetime.datetime.now()
print("Vuosi:", aika.year)
print("Kuukausi:", aika.month)
print("Päivä:", aika.day)
print("Tunti:", aika.hour)
print("Minuutti:", aika.minute)
print("Sekunti:", aika.second)

Ohjelman tulostus voi olla seuraava:

Vuosi: 2015
Kuukausi: 10
Päivä: 14
Tunti: 22
Minuutti: 34
Sekunti: 48

Ajan mittaus ja odotus

Moduulin time avulla voi mitata aikaa ja odottaa halutun ajan.

Seuraava ohjelma mittaa, kuinka nopeasti käyttäjä vastaa kysymykseen:

import time
alku = time.time()   # ajan mittaus alkaa
tulos = int(input("Paljonko on 13 * 19? "))
loppu = time.time()  # ajan mittaus päättyy
if tulos == 247:
    print("Oikein!")
else:
    print("Väärin!")
print("Aika:", round(loppu - alku, 1), "s")

Ohjelman tulostus voi olla seuraava:

Paljonko on 13 * 19? 247
Oikein!
Aika: 7.6 s

Tässä funktio time ilmoittaa järjestelmän ajanlaskun alusta kuluneen ajan sekunteina. Kahden tällaisen ajan erotus kertoo, miten paljon aikaa on kulunut kahden ohjelman kohdan välillä.

Seuraava ohjelma odottaa viisi sekuntia ennen toisen rivin tulostusta:

import time
print("Odota, kun Henrikki pukee haarniskan...")
time.sleep(5)
print("Valmista tuli!")

Ohjelman tulostus on seuraava:

Odota, kun Henrikki pukee haarniskan...
... (viiden sekunnin odotus)
Valmista tuli!

Tiedostojärjestelmä

Moduulin os kautta voi hakea tietoja tiedostojärjestelmästä.

Seuraava ohjelma tarkistaa, onko tiedosto olemassa. Jos tiedosto on olemassa, ohjelma myös ilmoittaa sen koon.

import os
if os.path.exists("uolevi.txt"):
    print("Tiedosto on olemassa!")
    print("Koko:", os.path.getsize("uolevi.txt"), "tavua")
else:
    print("Tiedostoa ei ole olemassa!" )

Tässä on ohjelman mahdollisia tulostuksia:

Tiedosto on olemassa!
Koko: 153 tavua
Tiedostoa ei ole olemassa!

Seuraava ohjelma listaa ohjelman hakemiston tiedostot ja alihakemistot:

import os
for tiedosto in os.listdir("."):
    if os.path.isfile(tiedosto):
        print("tiedosto", tiedosto)
    if os.path.isdir(tiedosto):
        print("hakemisto", tiedosto)

Ohjelman tulostus voi olla seuraava:

hakemisto kuvat
tiedosto laskin.py
tiedosto lista.py
tiedosto nimi.py
tiedosto rivit.txt
tiedosto tarina.txt
hakemisto vara
tiedosto viesti.py

Komennon suoritus

Moduulin os avulla voi myös suorittaa komennon käyttöjärjestelmässä.

Seuraava ohjelma käynnistää Pasianssi-pelin Windows-ympäristössä:

import os
os.system("sol.exe")

Seuraava ohjelma kopioi tiedoston Linux-ympäristössä:

import os
os.system("cp vanha.txt uusi.txt")

Nettisivun haku

Moduulin urllib avulla voi hakea tietoa Internetistä.

Seuraava ohjelma hakee nettisivun Ohjelmointiputkan palvelimelta:

import urllib.request
osoite = "https://www.ohjelmointiputka.net/tiedostot/henrikki.html"
sivu = urllib.request.urlopen(osoite)
data = sivu.read()
try:
	teksti = data.decode("UTF-8")
	print(teksti)
except:
	try:
		teksti = data.decode("Latin-1")
		print(teksti)
	except:
		print("Merkistökoodaus ei ole UTF-8 eikä Latin-1.")
		print("Tulostetaan data ilman dekoodausta:")
		print(data)

Ohjelman tulostus on seuraava:

<html>
<head>
<meta charset="UTF-8" />
<title>Henrikin sivu</title>
</head>
<body>
<h1>Henrikin sivu</h1>
<p><i>Henrikki on urhea ritari,<br>
syntynyt vuonna 1672 kaukana täältä.<br>
Henrikki on tämän pelin sankari.<br>
Nyt Henrikki on 25 vuotta vanha,<br>
eletään vuotta 1697 siis.</i></p>
</body>
</html>

Ladattava tiedosto ei välttämättä sisällä tekstiä, joten Python palauttaa sen binääridatana. Data täytyy muuttaa tekstiksi decode-metodilla, ja muunnokseen täytyy osata valita oikea merkistökoodaus.

Säännölliset lausekkeet

Moduulin re avulla voi käyttää säännöllisiä lausekkeita merkkijonojen käsittelyssä.

Säännöllinen lauseke on kuvaus merkkijonon rakenteesta. Säännöllisen lausekkeen avulla voi esimerkiksi tarkistaa, onko merkkijono oikeanmuotoinen, tai etsiä tekstistä tietynlaisia merkkijonoja.

Lisää tietoa säännöllisistä lausekkeista on esimerkiksi seuraavalla sivustolla:

http://www.regular-expressions.info/

Seuraava ohjelma tarkistaa käyttäjän antaman päivämäärän:

import re
paivays = input("Kirjoita päivämäärä: ")
if re.match("[0-9]{1,2}.[0-9]{1,2}.[0-9]{4}", paivays):
    print("Muotoilu on oikea!")
else:
    print("Muotoilu on väärä!")

Tässä on ohjelman mahdollisia tulostuksia:

Kirjoita päivämäärä: 25.10.2009
Muotoilu on oikea!
Kirjoita päivämäärä: kappas
Muotoilu on väärä!
Kirjoita päivämäärä: 123.123.123
Muotoilu on väärä!

Tässä säännöllinen lauseke [0-9]{1,2}.[0-9]{1,2}.[0-9]{4} vaatii, että merkkijonossa on ensin 1–2 numeroa, sitten piste, sitten 1–2 numeroa, sitten piste ja lopuksi 4 numeroa (eli kyseessä on päivämäärä).

Seuraava ohjelma etsii tekstistä kaikki luvut:

import re
teksti = "Henrikki syntyi vuonna 1672 ja on 25 vuotta."
luvut = re.findall("[0-9]+", teksti)
for luku in luvut:
    print(luku)

Ohjelman tulostus on seuraava:

1672
25

Tässä säännöllinen lauseke [0-9]+ vaatii, että merkkijono muodostuu numeroista 0–9 ja siinä on ainakin yksi merkki (eli kyseessä on luku).


Kommentit

janari [17.11.2015 19:55:03]

#

import os
os.system("sol.exe")

Huomasin että itselläni(Python 2.7.10.) tulee kirjoittaa sovelluksia avatessa (esimerkiksi):

import os
os.system("start firefox.exe")

Muut tiedostotyypit näyttivät avautuneen ilman "start" komentoa.

Koodi123 [24.03.2019 15:09:29]

#

janari kirjoitti:

Huomasin että itselläni(Python 2.7.10.)

Miksi et katso Ohjelmointiputkan Python 2-opasta, jos et ohjelmoi Python 3:lla, vaan Python 2:lla?

Kirjoita kommentti

Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta