Python logo

Programmering med Python

Focus mode
Light/dark-mode

Tillämpningar

1. Bildredigering med Pillow#

Pillow är en Python-modul för bildbehandling. Den är en vidareutveckling av det äldre biblioteket PIL (Python Imaging Library) och används för att öppna, skapa, redigera och spara bilder i många olika format (t.ex. JPEG, PNG, GIF, BMP).

Med Pillow kan man till exempel:

  • Öppna och visa bilder: Image.open("bild.jpg")
  • Ändra storlek, rotera eller beskära bilder
  • Skapa animerade gif:ar
  • Justera färg, kontrast, ljusstyrka eller lägga på filter
  • Rita på bilder (text, former, linjer) med ImageDraw
  • Konvertera mellan olika bildformat
  • Skapa nya bilder från grunden

1.1 Installera Pillow#

Pillow är ett externt kodbibliotek och måste hämtas och installeras innan det går att använda. PIP är ett verktyg som hanterar installation av kodbibliotek och följer med i alla Python-installationer. I kommandotolken (Shell i Linux, Powershell i Windows och Terminal på Mac) skriver du följande:

pip install Pillow

1.2 Ändra färgläge, justera kontrast och ljushet#

from PIL import Image, ImageEnhance

dog = Image.open("dog.jpg")

# Steg 1: Gör svartvit
bw_dog = dog.convert("L")

# Steg 2: Höj kontrasten
hc_dog = ImageEnhance.Contrast(bw_dog).enhance(1.4)

# Steg 3: Minska ljusheten (brightness)
emo_dog = ImageEnhance.Brightness(hc_dog).enhance(0.6)

# Steg 4: Spara bilden
emo_dog.save("emo_dog.jpg")

1.3 Redigera en bild med ImageOps#

Klassen ImageOps innehåller flera metoder för att förändra en bild.

from PIL import Image, ImageOps

with Image.open('image.jpg') as img:
    # Inverterar alla pixlar över ett visst gränsvärde
    img = ImageOps.solarize(img, 60)

    # Lägger till en ram runt bilder
    img = ImageOps.expand(img, 10, (255, 255, 255))

    # Reducerar bitdjupet (antal färger)
    img = ImageOps.posterize(img, 2)

    # Skalar om en bild
    img = ImageOps.scale(img, 0.2)

    # Vänder en bild upp- och ned
    img = ImageOps.flip(img)

    # Spegelvänder en bild
    img = ImageOps.mirror(img)

    img.save('img/newimage.jpg')

1.4 Skapa en animerad GIF-bild#

from PIL import Image

# Filnamn
image_filenames = [
    "img1.jpg",
    "img2.jpg",
    "img3.jpg",
    "img4.jpg",
]

# Öppna bilderna och lägg in den i en lista
images = [Image.open(filename) for filename in image_filenames]

# Spara bilderna som en animerad GIF
images[0].save(
    "animation.gif",
    append_images=images[1:],
    duration=500,  # Hur länge en bildruta ska visas (millisek.)
    loop=0,  # Evig loop
)

1.5 Batch-resize#

Detta exempel tar alla bilder i en mapp och skalar om dem till 200 x 200 pixlar.

import glob
from PIL import Image, ImageOps

def resize_image(source_path, dest_path):
    """Resize and save image"""
    with Image.open(source_path) as img:
        img = ImageOps.fit(img, (200, 200))
        img.save(dest_path)

# Välj alla jpg-bilder i mappen 'images'
paths = glob.glob("images/*.jpg")

# Gå igenom alla bilder och anropa funktionen 
# som skalar om och sparar
for path in paths:
    filename = path.split('/')[-1]
    resize_image(path, 'resized/' + filename)

1.6 Rita grafik med ImageDraw#

Man kan även rita enkel grafik med Pillow. För att göra det behöver man skapa ett ImageDraw-objekt.

from PIL import Image, ImageDraw

# RGB-värden för blå och gul
BLUE = (0, 106, 167)
YELLOW = (254, 204, 0)

# Skapa en ny bild
im = Image.new("RGB", (160, 100), BLUE)

# Skapa ett ImageDraw-objekt för att kunna rita grafik
imd = ImageDraw.Draw(im)

# Rita två rektanglar
imd.rectangle([(50, 0), (70, 100)], YELLOW)
imd.rectangle([(0, 40), (160, 60)], YELLOW)

im.save("flag.png")

2. Matplotlib#

Matplotlib är en Python-modul för visualisering av data. Den används för att skapa diagram, grafer och figurer utifrån data på ett flexibelt och programmerbart sätt.

Med Matplotlib kan man till exempel:

  • Rita grafer, linjediagram, stapeldiagram, cirkeldiagram och punktdiagram
  • Anpassa färger, etiketter, titlar och axlar
  • Spara diagram som bilder (t.ex. PNG, PDF eller SVG)

Matplotlib brukar kombineras med bibliotek som NumPy och Pandas för att visualisera data direkt från beräkningar eller dataset.

2.1 Enkel plot#

import matplotlib.pyplot as plt

a = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

plt.plot(a)
plt.show()

# Eller för att spara bild: 
plt.savefig('my_plot.png')

2.2 Stapeldiagram#

import matplotlib.pyplot as plt

flavors = ["Jordgubb", "Blåbär", "Choklad", "Lakrits"]
answers = [10, 5, 6, 2]

colors = ["red", "blue", "brown", "black"]

plt.bar(flavors, answers, color=colors)

plt.show()

# Eller för att spara bild: 
plt.savefig('my_table.png')

2.3 Histogram#

Ett histogram visar fördelningen av numeriska data indelat i olika intervaller (kallas bins i matplotlib.) I exemplet nedan visas 200 provresultat i ett histogram.

import matplotlib.pyplot as plt

test_result = [37, 40, 70, 34, 41, 60, 41, 66, 46, 45, 25, 48, 65, 62, 58, 31, 17, 54, 64, 65, 18, 55, 65, 18, 53, 38, 83, 19, 35, 37, 13, 61, 87, 99, 48, 39, 47, 52, 32, 44, 31, 49, 24, 49, 43, 55, 23, 61, 41, 58, 47, 19, 32, 81, 58, 65, 46, 32, 58, 45, 27, 54, 73, 18, 56, 38, 18, 57, 32, 36, 18, 65, 57, 39, 70, 30, 22, 69, 5, 51, 53, 70, 20, 36, 63, 43, 35, 68, 22, 41, 24, 35, 65, 58, 57, 47, 58, 46, 47, 78, 34, 35, 18, 62, 74, 58, 75, 63, 53, 78, 6, 45, 53, 43, 49, 55, 75, 45, 25, 95, 10, 24, 60, 63, 59, 76, 70, 69, 80, 48, 83, 35, 61, 66, 84, 5, 90, 68, 46, 51, 70, 59, 41, 57, 54, 87, 46, 39, 62, 100, 18, 22, 53, 42, 100, 59, 37, 42, 55, 31, 36, 87, 68, 49, 37, 46, 16, 58, 61, 34, 82, 88, 53, 61, 53, 64, 62, 43, 17, 54, 51, 49, 64, 64, 39, 39, 50, 53, 74, 27, 20, 53, 45, 35, 67, 34, 33, 50, 50, 58]

plt.hist(test_result, bins=20)
plt.show()

2.4 Plot av vågformer#

I det här exemplet har vi en funktion som genererar en sinusvåg med hjälp av math.sin. Funktionen används sedan för att generera två vågor som visualiseras med matplotlib.

import math
import matplotlib.pyplot as plt

def get_wave(samples, frequency):
    """Return a sine wave as list values"""
    step = math.tau / samples * frequency
    return [math.sin(i * step) for i in range(samples)]

wave1 = get_wave(400, 2)
wave2 = get_wave(400, 40)

# Multiplicera värdena i de två listorna med varandra
wave3 = [a * b for a, b in zip(wave1, wave2)]

plt.plot(wave1)
plt.plot(wave3)
plt.show()

3. Python och databaser#

sqlite3 är en inbyggd Python-modul för att hantera databaser med hjälp av SQLite, som är en lättviktig, filbaserad databas. Till skillnad från andra databaser kräver sqlite3 ingen server och sparar all data i en enda fil.

Databaser används för att lagra, organisera och snabbt hitta information, till exempel i appar, webbsidor, kundregister eller statistiksystem. Databaser består av en eller flera tabeller. Databastabeller kan liknas med ett kalkylark uppdelat i kolumner och rader. Varje rad representerar en post.

Med sqlite3 kan man till exempel:

  • Skapa och ansluta till en databasfil
  • Skapa tabeller och definiera kolumner
  • Lägga till, läsa, uppdatera och ta bort data med SQL-kommandon
  • Söka och filtrera information ur databasen
  • Integrera databaser i Python-program utan att installera något extra

3.1 SQL#

SQL (Structured Query Language) är ett språk som används för att skapa, hantera och hämta data i databaser. Det används till att skicka kommandon till databasen för att hämta information, lägga till rader etc.

De huvudsakliga kommandona är:

SQL Förklaring Exempel
SELECT Hämtar data från en tabell. SELECT * FROM students – hämtar alla rader och kolumner från tabellen elever.
INSERT Lägger till en ny rad i en tabell. INSERT INTO students (name, age) VALUES ('Anna', 17)
UPDATE Ändrar data i en eller flera rader. UPDATE students SET age = 18 WHERE name = 'Anna'
DELETE Tar bort rader från en tabell. DELETE FROM students WHERE name = 'Anna'

3.2 Datatyper för kolumner#

Varje kolumn i en tabell måste ha en viss datatyp. Datatypen anger man när man skapar tabellen.

Datatyp Beskrivning Exempelvärden
NULL Ett tomt värde (saknas) NULL
INTEGER Heltal (lagras som 1–8 byte beroende på storlek) 42, -10, 2025
REAL Flyttal (decimaler, lagras som 8-byte float) 3.14, -0.5, 2.71828
TEXT Textsträngar (lagras som Unicode) 'Hej', 'Anna', '2025-11-09'
BLOB Binära data (lagras som de är, utan tolkning) t.ex. en bild eller fil i binär form

3.3 Skapa (eller öppna) en databas#

import sqlite3

# Skapar (eller öppnar) en databasfil
conn = sqlite3.connect("school.db")

# Skapar ett "cursor"-objekt för att köra SQL-kommandon
cur = conn.cursor()

3.4 Skapa en tabell#

create_sql = """
CREATE TABLE IF NOT EXISTS students (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT,
    age INTEGER,
    points INTEGER
)
"""

cur.execute(create_sql)

3.5 Radera en tabell#

cur.execute("DROP TABLE IF EXISTS students")

3.6 Lägga till rader (INSERT)#

insert_sql = "INSERT INTO students (name, age, points) VALUES (?, ?, ?)"

cur.execute(insert_sql, ("Anna", 18, 85))
cur.execute(insert_sql, ("Bertil", 17, 82))
cur.execute(insert_sql, ("Ceasar", 19, 56))
cur.execute(insert_sql, ("Dagny", 18, 98))
cur.execute(insert_sql, ("Erik", 16, 32))


conn.commit()  # Sparar ändringarna

3.7 Hämta data (SELECT)#

cur.execute("SELECT * FROM students")
result = cur.fetchall()

for student in result:
    print(student)

3.8 Hämta data med villkor (WHERE)#

cur.execute("SELECT * FROM students WHERE age > 18")
result = cur.fetchall()

for student in result:
    print(student)

3.9 Hämta data med sortering (ORDER BY)#

cur.execute("SELECT * FROM students ORDER BY points DESC")
result = cur.fetchall()

for student in result:
    print(student)

3.10 Uppdatera och radera (UPDATE och DELETE)#

update_sql = "UPDATE students SET points = ? WHERE name = ?"
cur.execute(update_sql, (95, "Anna"))

delete_sql = "DELETE FROM students WHERE name = ?"
cur.execute(delete_sql, ("Bertil",))

conn.commit()

4. Data-analys#

Pandas är en Python-modul för dataanalys. Dataanalys är processen att undersöka, bearbeta och tolka data för att hitta mönster, samband eller insikter.

Pandas gör det enkelt att läsa, bearbeta och analysera stora datamängder, till exempel från CSV- eller Excel-filer.

Med Pandas kan man bland annat:

  • Effektivt hantera stora tabeller med data
  • Sortera, filtrera och gruppera data
  • Beräkna statistik och skapa nya kolumner utifrån befintlig data
  • Kombinera och slå samman flera datakällor

Pandas används alltså när man har behov av att strukturera, undersöka eller manipulera data på ett smidigt sätt i Python. Konkreta tillämpningar kan exempel vara:

  • För att analysera försäljningsdata eller ekonomi i företag
  • Bearbeta och rensa experiment- eller sensordata
  • Hantera kundregister eller användardata i appar och webbplatser
  • Skapa statistik och rapporter från stora CSV- eller Excel-filer
  • Förbereda data för visualisering eller maskininlärning

5. Webbapplikationer med Flask#

Flask är ett lättviktigt Python-ramverk för att bygga webbapplikationer.

Med Flask kan man snabbt skapa webbplatser och API:er, hantera webbsidor, formulär och databaskopplingar, utan att behöva ett stort och komplext system.

5.1 Installera flask#

Flask är en extern modul och måste installeras innan det används i ett projekt. Det enklaste sättet att installera externa moduler är med kommandot pip (som är inkluderat i alla python-installationer.)

pip install flask

För att använda Flask behöver du alltså en utvecklingsmiljö där du har möjlighet att installera kodpaket (t.ex. Github Codespace).

5.2 En enkel webbapp#

Detta exempel visar textsträngen 'Hello world' när man besöker webbsidan.

from flask import Flask

# Skapa en Flask-app
app = Flask(__name__)

# Ange vad som händer när man går in på startsidan '/'
@app.route('/')
def home():
    return 'Hello world'

# Starta webbappen när man kör python-filen
if __name__ == "__main__":
    app.run(debug=True)

I exemplet ovan har vi kopplat funktionen home() till routen ('/') - alltså startsidan på sajten.

Man startar sedan webbappen genom att skriva i terminalen:

python filnamn.py

Då startas en enkel webbserver som tar emot HTTP-anrop.

5.3 Ta emot parametrar i webbadressen#

Delar av en webbadress som ska fungera som parametrar ramar man in med < >. Samma parameternamn måste då också finnas med i funktionsdefinitionen.

# På adressen /hello/ kan man ange sitt namn som parameter
@app.route("/hello/<namn>")
def hello(namn):
    return "Hej " + namn

5.4 Använda HTML-mallar#

Flask använder mallsystemet Jinja2. Med det kan man skapa HTML-mallar som sedan dynamiskt fylls med information med Python.

OBS! HTML-mallarna behöver ligga i en mapp som heter templates för att Flask ska kunna hitta dem.

I exemplet använder vi funktionen render_template för att rendera mallen user.html. Vi skickar samtidigt med en variabel (username=name) som kan skrivas ut i mallen:

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/user/<name>")
def user(name):
    return render_template("user.html", username=name)

Mallen templates/user.html kan då se ut så här:

<!DOCTYPE html>
<html>
<head>
    <title>Min Flask-app</title>
</head>
<body>
    <h1>Hej {{ username }}!</h1>
</body>
</html>

För att skriva ut variabeln som skickats till mallen använder vi dubbla klammerparanteser: {{ variabelnamn }}.

5.5 Ta emot data från formulär#

Genom objektet request kan man ta emot data från webbformulär.

Om man har ett HTML-formulär som ser ut så här:

<form method="POST" action="/show">
    <input type="text" name="food" placeholder="Favoriträtt">
    <input type="submit" value="Skicka">
</form>

… kan man ta emot formulär-informationen med Flask så här:

from flask import Flask, request

@app.route("/show", methods=["POST"])
def show():
    food = request.form["food"]
    return "Du gillar: " + food

5.6 Länkar i templates#

Med funktionen url_for kan man infoga webbadressen till en route.

<a href="{{ url_for('about') }}">Om oss</a>

5.7 Länka till statiska filer#

Om man i sina HTML-mallar vill länka till statiska filer (bilder, CSS-filer etc.) anger man 'static' som första parameter i url_for. För att flask ska hitta de statiska filerna måste de ligga i en mapp som heter static.

Här länkar vi in ett CSS-dokument:

<link href="{{ url_for('static', filename='css/main.css') }}" rel="stylesheet">

Och här lägger vi in en bild:

<img src="{{ url_for('static', filename='img/dog.jpg') }}" alt="Hund">

6. Webbscraping#

Webbscraping är tekniken att hämta innehåll från webbsidor automatiskt med ett program istället för att kopiera den manuellt. Det används ofta för att samla in information från sajter som inte erbjuder ett API.

Två vanliga Python-moduler för webbscraping är:

  • requests – används för att hämta HTML-innehållet från en webbsida.
  • BeautifulSoup – används för att bearbeta och analysera HTML-koden, så att man kan hitta och extrahera den data man vill ha.

Tillsammans gör de det enkelt att skrapa och strukturera information från webben.