Standardbiblioteket

Python har mange moduler som er innebygget i selve språket, men som likevel ikke er umiddelbart tilgjengelig uten av vi importer dem først. Slike moduler er en del av Python sitt standardbibliotek, og inkluderer moduler som math, random, copy, time, datetime, csv, decimal, sys, os og mange andre. Se docs.python.org/3/library for en fullstendig oversikt.

For å bruke en modul fra python sitt standardbibliotek, holder det å skrive import <modulnavn>. Konvensjon tilsier at dette gjøres øverst i filen.

Under viser vi frem et par eksempler fra noen utvalgte moduler fra Python sitt standardbibliotek.

Matematikk

Dato og tid

Håndtere vanlige filformater

Interaksjon med operativsystemet og filstrukturen


math

https://docs.python.org/3/library/math.html

import math

# Noen utvalgte konstanter
print(math.pi)                 # 3.141592653589793
print(math.e)                  # 2.718281828459045
print(math.inf)                # uendelig
print(-math.inf)               # minus uendelig
print()

# Noen utvalgte funksjoner
print(math.ceil(3.22))         # 4, runder alltid av oppover
print(math.floor(3.9))         # 3, runder alltid av nedover
print(math.radians(180))       # 3.14..., konverter grader til radianer
print(math.degrees(math.pi/2)) # 90.0, konvertere radianer til grader
print(math.cos(math.pi))       # -1.0, cosinus-funksjonen
print(math.factorial(4))       # 24, faktorial-funksjonen (24 = 1*2*3*4)
random

https://docs.python.org/3/library/random.html

import random

def demonstrate_random():
    y = random.random()                # Et tilfeldig flyttall mellom 0 og 1
    x1 = random.choice(range(10))      # En tilfeldig int mellom 0 og 9
    x2 = random.choice(range(10))      # En tilfeldig int mellom 0 og 9
    x3 = random.choice(range(10))      # En tilfeldig int mellom 0 og 9
    s = random.choice(["a", "b", "c"]) # Tilfeldig element fra en liste
    print(s, x1, x2, x3, y)

print("Før kall til seed:")
demonstrate_random()

# MERK: RESTEN AV DETTE EKSEMPELET FUNGERER DÅRLIG FOR PYTHON I NETTLESEREN,
# MÅ DERFOR TESTES LOKALT PÅ DIN MASKIN

# Tilfeldige tall er ikke egentlig tilfeldige, men blir generert med
# utgangspunkt i klokkeslettet når funksjonen blir kalt. Vi kan velge
# å i stedet ta utgangspunkt i en verdi vi selv bestemmer, med 'seed'.
random.seed(42) # Vi velger selv verdien av 42

# Forsøk å kjøre koden gjentatte ganger lokalt på din maskin og se hva
# forskjellen blir før og etter kallet til seed-metoden.
print("Etter kall til seed(42):")
demonstrate_random()
time

https://docs.python.org/3/library/time.html

import time

print(time.time()) # Antall sekunder siden 1. januar 1970 som flyttall
datetime

https://docs.python.org/3/library/datetime.html

from datetime import datetime, timedelta

# Et datetime -objekt representerer et bestemt tidspunkt
lecture_starts = datetime(2022, 10, 24, 14, 15, 00)
print(f"{lecture_starts = }")
print(f"{lecture_starts.year = }, {lecture_starts.month = }")
print(f"Ukedag: {lecture_starts.weekday()} (0=Mandag, 6=Søndag)")
print()

# Et timedelta -objekt representerer en gitt varighet
lecture_duration = timedelta(hours=1, minutes=45)
print(f"{lecture_duration = }")

# Forholdstall mellom varigheter kan brukes for å telle hvor mange
# dager/timer/sekunder/millisekunder det er i en varighet.
minute = timedelta(minutes=1)
print(f"{lecture_duration / minute = }") # Antall minutter totalt
hour = timedelta(hours=1)
print(f"{lecture_duration / hour = }")  # Antall timer
print()

# Tidspunkt + varigheter gir et nytt tidspunkt
lecture_ends = lecture_starts + lecture_duration
print(f"{lecture_ends = }")
print()

# Tidspunktet akkurat nå
now = datetime.now()
print(f"{now = }")

# Tidspunkt minus tidspunkt gir varighet
time_since_lecture_started = now - lecture_starts
print(f"{time_since_lecture_started = }")
csv

https://docs.python.org/3/library/csv.html

import csv
# Du kan kopiere funksjonene for å lese/skrive csv-filer og bruke dem 
# som du ønsker uten å sitere.

def read_csv_file(path, encoding="utf-8", **kwargs):
    r''' Reads a csv file from the provided path, and returns its
    content as a 2D list. The default encoding is utf-8, the default
    column delimitier is comma and the default quote character is the
    double quote character ("), though this can be overridden with
    named parameters "delimiter" and "quotechar".'''
    with open(path, "rt", encoding=encoding, newline='') as f:
        return list(csv.reader(f, **kwargs))

def write_csv_file(path, table_content, encoding='utf-8', **kwargs):
    r""" Given a file path and a 2D list representing the content, this
    method will create a csv file with the contents formatted as csv.
    By defualt the delimiter is a comma and the quote character is
    the double quote, but this can be overridden with named parameters
     "delimiter" and "quotechar". """
    with open(path, "wt", encoding=encoding, newline='') as f:
        writer = csv.writer(f, **kwargs)
        for row in table_content:
            writer.writerow(row)

# Eksempeler på bruk. Først, en 2D-liste med innholdet i tabellen.
org_content = [
    ["Name", "Age"],
    ["Ola", 74],
    ['"Kari"', "73"],
]
print("Original 2D-liste:", org_content)

# Eksempel 1: standard parametre (se resultat i foo.csv)
write_csv_file("foo.csv", org_content)
with open("foo.csv", encoding='utf-8') as f:
    print("write_csv_file, standard parametre:", repr(f.read()))
readback_content = read_csv_file("foo.csv")
print("read_csv_file, standard parametre:", readback_content)

# Eksempel 2: eksempel på bruk av navngitte parametre (se resultat i bar.csv)
# delimiter="|" endrer skillesymbolet til vertikal strek
# quoting=csv.QUOTE_NONNUMERIC gjør at alt unntatt tall-verdier omsluttes
# av hermetegn; og ved lesing, at tall uten hermetegn konverteres til float.
write_csv_file("bar.csv", org_content, delimiter="|", 
                                       quoting=csv.QUOTE_NONNUMERIC)
with open("bar.csv", encoding='utf-8') as f:
    print("write_csv_file, med egne parametre:", repr(f.read()))
readback_content = read_csv_file("bar.csv", delimiter="|",
                                            quoting=csv.QUOTE_NONNUMERIC)
print("read_csv_file, med egne parametre:", readback_content)
json

https://docs.python.org/3/library/json.html

JSON er et filformat basert på ren tekst som i sin struktur er nesten nøyaktig som et oppslagsverk hvor alle nøklene er strenger. På samme måte som for CSV er det enkelte detaljer som gjør at import og eksport av JSON likevel gjøres best med en egnet modul.

import json

# Eksempel på innholdet i en JSON-fil som en streng (såkalt JSON-streng)
sample_json_string = """\
{
  "name": "Kari",
  "is_alive": true,
  "age": 27,
  "address": {
    "street": "Gateveien 1234",
    "city": "En 'by'",
    "postal_code": "5000"
  },
  "phone_numbers": [
    {
      "type": "home",
      "number": "12345678"
    },
    {
      "type": "office",
      "number": "23456789"
    }
  ]
}
"""

# For å konvertere fra JSON-streng til oppslagsverk
d = json.loads(sample_json_string)
print(type(d)) # dict
print(d["name"], "har telefonnummer", d["phone_numbers"][0]["number"])
print()

# For å konvertere fra oppslagsverk til JSON-streng
d["age"] += 42 # Liten endring først
s1 = json.dumps(d) # Kompakt JSON-streng, bra for nedlasting/datamaskiner
s2 = json.dumps(d, indent=2) # Pen og leselig JSON-streng, bra for mennesker
print(s1)
print(str(d)) # Legg merke til at s1 ligner på str(d). Ser du forskjellene?
print(s2)
sys

https://docs.python.org/3/library/sys.html

import sys

# Avslutt python umiddelbart
sys.exit()
print("Vi kommer aldri hit")
os og shutil

https://docs.python.org/3/library/os.html

https://docs.python.org/3/library/os.path.html

https://docs.python.org/3/library/shutil.html

os er en modul med mange avanserte funksjoner, men også et par funksjoner som er greie å ha for å navigere filsystemet lokalt på datamaskinen. shutil er en modul som også jobber med filer, gjerne mer enn én om gangen.

For å testekoden under, lim den inn i en fil og kjør filen på din lokale maskin.

import os
import shutil
# os er en modul med mange avanserte funksjoner, men også et par funksjoner
# som er greie å ha for å navigere filsystemet lokalt på datamaskinen.
# shutil er en modul som også jobber med filer, gjerne mer enn én om gangen.

# Vis `current working directory` (cwd). Dette er den mappen python
# vil bruke som utgangspunkt for å se etter filstier.
full_folder_path = os.getcwd() # en streng
print("Current working directory er:\n", full_folder_path) 

print("Oppretter nå en fil foo.txt med innhold: 'woof\nbark\n'")
with open("foo.txt", "wt", encoding='utf-8') as f:
    f.write("woof\nbark\n")
print("Foo.txt ble opprettet i mappen:\n", os.getcwd())

# Komplett filsti for filen foo.txt vi nettopp opprettet. Dette er bedre enn
# `os.getcwd() + "/foo.txt"` fordi det virker både for Windows og Mac.
full_file_path = os.path.join(os.getcwd(), "foo.txt")
print("Filsti (path) for foo.txt:", full_file_path)
print("Sjekk at filen foo.txt ble opprettet i denne mappen")
input("Trykk enter for å fortsette")
print()

print("Oppretter nå mappen bar inne i en mappen egg, inne i en mappen temp")
os.makedirs(os.path.join("temp", "egg", "bar"))
print("Sjekk at mappene temp/egg/bar ble opprettet i ", os.getcwd())
input("Trykk enter for å fortsette")
print()

def print_contents_of_folder(path_to_folder):
    print("Ser på alle ting i mappen", path_to_folder)
    # os.listdir returnerer en liste med strenger
    for subpath in sorted(os.listdir(path_to_folder)):
        # subpath er navnet til fil/mappe som er i mappen folder_path
        full_subpath = os.path.join(path_to_folder, subpath)
        subpath_is_file = os.path.isfile(full_subpath)
        print("file    " if subpath_is_file else "folder  ", end="")
        print(subpath)

print_contents_of_folder(full_folder_path)
input("Trykk enter for å fortsette")
print()

print("Endrer cwd (current working directory) til mappen temp/egg/bar")
os.chdir(os.path.join(full_folder_path, "temp", "egg", "bar"))
print("Nå er os.getcwd() =", os.getcwd())
print("Oppretter filer xi.txt, tau.txt, alpha.txt")
for filename in ["xi.txt", "tau.txt", "alpha.txt"]:
    with open(filename, "wt", encoding='utf-8') as f:
        f.write("hiha")
print_contents_of_folder(os.getcwd())
input("Trykk enter for å fortsette")
print()

print("Endrer cwd ved å gå til mappen på nivået over tre ganger")
for _ in range(3):
    os.chdir(os.path.dirname(os.getcwd()))
    print("cwd er nå", os.getcwd())
input("Trykk enter for å fortsette")
print()

temp_folder_path = os.path.join(os.getcwd(), "temp")
print("Sjekker om stien eksisterer:", temp_folder_path)
print(os.path.exists(temp_folder_path))
print("Går igjennom alt innhold uansett dypbe:", temp_folder_path)
for dirpath, dirnames, filnames in os.walk(temp_folder_path):
    print(dirpath, dirnames, filnames)
input("Trykk enter for å fortsette")
print()

os.remove(full_file_path)
print("Fjernet foo.txt")
input("Trykk enter for å fortsette")
print()

import shutil
shutil.rmtree(temp_folder_path)
print("Fjernet temp-mappen inkludert alt innhold")
print("Ferdig!")