Hopp til innhold
Øvelse

Artsdatabase – modell

Du bruker antakelig søkbare databaser mange ganger om dagen uten å tenke så mye over hvordan de er lagd. Her skal vi bygge en enkel database som kan brukes som bestemmelsesnøkkel for fugler. Når du jobber med denne oppgaven, vil du få et innblikk i hvordan slike databaser kan bygges opp.

Artsdatabase

Det finnes millioner av arter på jorda. Alle har sine unike egenskaper og kjennetegn. I flere tusen år har vi mennesker jobbet med å kartlegge arter, og jobben er langt fra ferdig. Etter at man begynte å registrere innsamlede data i databaser, har det blitt langt enklere å finne ut om man har funnet en ny art, eller om den er registrert tidligere.

I programmet vi skal skrive nå, skal vi lage en enkel artsdatabase der du lett kan søke opp arten du ønsker å artsbestemme.

Lagre data i filer

Hvis vi vil lagre det som skrives i et program, må vi få programmet til å skrive dette til en fil på harddisken. Når vi lager en database, vil vi ikke måtte legge inn alle arter på nytt hver gang vi kjører programmet. Vi ønsker heller ikke å legge inn programkoden på nytt hver gang vi vil utvide databasen.

Det første vi skal lære, er derfor å få Python til å skrive direkte til en fil på PC-en. Da må du opprette en mappe og en tekstfil slik det er beskrevet nedenfor, før du går videre.

  1. Opprett en mappe på nivået rett under C:\ på PC-en din. Kall den for eksempel Python-filer eller Arter.

  2. Opprett en tekstfil i Notisblokk (Notebook) med navnet Fugler.txt, og lagre den i mappen du har opprettet under C:\.

  3. Før du kjører programmet nedenfor, må du endre "c:\Arter\Fugler.txt" slik at det stemmer med mappen du har lagret filen din i. For å finne den nøyaktige plasseringen til filen kan du høyreklikke på den i filutforskeren og velge Egenskaper.

  4. Legg programmet (Python-kodene) inn i et Pyton-program, og lagre det. Du kan lagre Python-programmet i samme mappe som tekstfilen Fugler.txt, men siden koden i programmet uansett inneholder informasjon om plasseringen av tekstfilen, er ikke det viktig.

  5. Prøv å kjøre koden nedenfor i et Python-program.

python – Artsdatabase 1 – skriv til fil
1with open("c:\Arter\Fugler.txt", "a") as f:
2    f.write("Fugler!")

Åpne tekstfilen du lagde. Hvis du har gjort alt riktig, skal det nå stå "Fugler!" i filen.

Legg inn arter

Neste steg er å utvide programmet slik at vi kan legge inn fuglearter som lagres i filen og er der neste gang vi ønsker å legge til en fugl. Vi må også bestemme hvilke kjennetegn vi vil registrere. Det er disse kjennetegnene vi skal bruke når vi senere søker opp fugler i databasen.

I dette eksempelet holder vi oss til fire kriterier (som nok er for lite i en stor database): hodefarge, brystfarge, nebbform og nebbfarge.

Du kan enkelt endre eller legge til andre kjennetegn senere, for eksempel fotfarge eller ryggfarge. Studer koden, og forsøk å forstå hva hensikten med de ulike kommandoene er.

python – Artsdatabase 2 – bygg en base
1ny = "j"
2while ny == "j":
3    with open("C:\Arter\Fugler.txt", "a") as f:
4        navn = input("Artsnavn: ")
5        hodefarge = input("Velg hodefarge(skriv tallet).\n1:Grå"
6          "\n2:Gul\n3:Hvit\n4:Svart\n5:Blå\n6:Brun\n7:Grønn\n8:Rød\n")
7        if hodefarge == "1":
8            hodefarge = ("Grå")
9        elif hodefarge == "2":
10            hodefarge = ("Gul")
11        elif hodefarge == "3":
12            hodefarge = ("Hvit")
13        elif hodefarge == "4":
14            hodefarge = ("Svart")
15        elif hodefarge == "5":
16            hodefarge = ("Blå")
17        elif hodefarge == "6":
18            hodefarge = ("Brun")
19        elif hodefarge == "7":
20            hodefarge = ("Grønn")
21        elif hodefarge == "8":
22            hodefarge = ("Rød")
23 
24        brystfarge = input("Velg brystfarge.\n1:Rød\n2:Gul"
25          "\n3:Hvit\n4:Svart\n5:Grå\n6:Gul og svart\n7:Brun\n")
26        if brystfarge == "1":
27            brystfarge = ("Rød")
28        elif brystfarge == "2":
29            brystfarge = ("Gul")
30        elif brystfarge == "3":
31            brystfarge = ("Hvit")
32        elif brystfarge == "4":
33            brystfarge = ("Svart")
34        elif brystfarge == "5":
35            brystfarge = ("Grå")
36        elif brystfarge == "6":
37            brystfarge = ("Gul og svart")
38        elif brystfarge == "7":
39            brystfarge = ("Brun")
40       
41        nebbform = input("Velg nebbform.\n1:Spiss\n2:Butt"
42          "\n3:Lang\n")
43        if nebbform == "1":
44            nebbform = ("Spiss")
45        elif nebbform == "2":
46            nebbform = ("Butt")
47        elif nebbform == "3":
48            nebbform = ("Lang")
49           
50        nebbfarge = input("Velg nebbfarge.\n1:Rød\n2:Gul"
51          "\n3:Oransje\n4:Grå\n5:Svart\n")
52        if nebbfarge == "1":
53            nebbfarge = ("Rød")
54        if nebbfarge == "2":
55            nebbfarge = ("Gul")
56        if nebbfarge == "3":
57            nebbfarge = ("Oransje")
58        if nebbfarge == "4":
59            nebbfarge = ("Grå")
60        if nebbfarge == "5":
61            nebbfarge = ("Svart")
62           
63        print(navn,"er lagt til i databasen")
64        f.write("{},{},{},{},{}\n".format(navn,hodefarge,
65        brystfarge,nebbform,nebbfarge))
66        f.close()
67    ny = input("Vil du legge til flere arter? j/n: ")

Bygg opp databasen

Legg inn to fuglearter, og kontroller at de blir skrevet korrekt til filen. Bruk deretter litt tid på å legge inn flere fuglearter.

Du legger sikkert merke til at tekstfilen ikke er så lett å lese. Det står ikke spesifikt hvilken egenskap de ulike detaljene tilhører. Det er fordi tekstfilen ikke er ment å skulle leses av mennesker, men av vårt neste program. Jo mindre forklarende tekst vi legger inn der, jo enklere er det å lage et program som henter ut data fra filen.

Søk i basen

Tenk deg at du er ute på tur og har observert en fugl som du ikke vet navnet på. Du noterer kjennetegnene og prøver databasen din for å finne navnet. Det er selvsagt mulig å lete i tekstfilen etter en art med de samme kjennetegnene, men hvis databasen inneholder veldig mange arter, vil dette ta tid. Vi lager heller et program som leter for oss. Studer koden, og forsøk å forstå hva hensikten med de ulike kommandoene er.

Obs! Legg merke til at du velger tall som står for de opplysningene som ligger i databasen. Fire tall som 7,7,3,2 kan i en database bety "Grønn,Brun,Lang,Gul", som i denne basen gir arten stokkand som resultat. Det er også mulig å velge "Vet ikke". Da vil programmet foreslå arter som kan likne.

Hvis du vil bruke Trinket Python-editor

Siden Trinket Python-editoren ikke har tilgang til disken på PC-en, må kodene i tekstfilen "Fugler" legges inn i en egen fane i editoren for at programmet skal finne dem. Bruk "+" for å legge til en ny fane i Trinket Python-editoren.

python – Artsdatabase 3 – søk i basen
1resultater = []
2linjenummer = 0
3funn=[]
4sok = [0]
5hodefarge = input("Velg hodefarge(skriv tallet).\n1:Grå\n2:Gul"
6  "\n3:Hvit\n4:Svart\n5:Blå\n6:Brun\n7:Grønn\n8:Rød\n9:Vet ikke\n")
7if hodefarge == "1":
8    sok.append("Grå")
9elif hodefarge == "2":
10    sok.append("Gul")
11elif hodefarge == "3":
12    sok.append("Hvit")
13elif hodefarge == "4":
14    sok.append("Svart")
15elif hodefarge == "5":
16    sok.append("Blå")
17elif hodefarge == "6":
18    sok.append("Brun")
19elif hodefarge == "7":
20    sok.append("Grønn")
21elif hodefarge == "8":
22    sok.append("Rød")
23elif hodefarge == "9":
24    sok.append("Uvisst")
25   
26brystfarge = input("Velg brystfarge.\n1:Rød\n2:Gul\n3:Hvit"
27  "\n4:Svart\n5:Grå\n6:Gul og svart\n7:Brun\n8:Vet ikke\n")
28if brystfarge == "1":
29    sok.append("Rød")
30elif brystfarge == "2":
31    sok.append("Gul")
32elif brystfarge == "3":
33    sok.append("Hvit")
34elif brystfarge == "4":
35    sok.append("Svart")
36elif brystfarge == "5":
37    sok.append("Grå")
38elif brystfarge == "6":
39    sok.append("Gul og svart")
40elif brystfarge == "7":
41    sok.append("Brun")
42elif brystfarge == "8":
43    sok.append("Uvisst")
44 
45 
46nebbform = input("Velg nebbform.\n1:Spiss\n2:Butt\n3:Lang"
47  "\n4:Vet ikke\n")
48if nebbform == "1":
49    sok.append("Spiss")
50elif nebbform == "2":
51    sok.append("Butt")
52elif nebbform == "3":
53    sok.append("Lang")
54elif nebbform == "4":
55    sok.append("Uvisst")
56 
57 
58nebbfarge = input("Velg nebbfarge.\n1:Rød\n2:Gul\n3:Oransje"
59  "\n4:Grå\n5:Svart\n6:Vet ikke\n")
60if nebbfarge == "1":
61    sok.append("Rød")
62elif nebbfarge == "2":
63    sok.append("Gul")
64elif nebbfarge == "3":
65    sok.append("Oransje")
66elif nebbfarge == "4":
67    sok.append("Grå")
68elif nebbfarge == "5":
69    sok.append("Svart")
70elif nebbfarge == "6":
71    sok.append("Uvisst")
72 
73with open("c:\Arter\Fugler.txt","r") as f:
74    for line in f:
75        linjenummer += 1
76        art = line.split(",")
77        strip = art[-1].rstrip("\n")  #Fjerner 
78                   #linjeskiftkommandoen fra teksten
79        art[-1] = strip
80        score = 0
81        for i in range(len(sok)):
82            if art[i] == sok [i]:
83                score += 1
84        if score >= 3:      #Hvis flere kriterer stemmer 
85                       #vil arten legges til i funnene
86            funn.append(art[0])
87 
88 
89print("\nFuglene som passer til dine kriterier er:")
90for i in range(len(funn)):
91    print(funn[i])

Jobb med programmet, og test funksjonalitet

Lag programmet, og prøv å søke opp arter ut fra filen du lagde med det første programmet.

  • Finner du arten?
  • Får du flere svar?
  • Hva kan du gjøre dersom det blir for mange svar ut fra de samme kjennetegnene?
  • Hvor mange arter og kjennetegn bør registreres i databasen før den blir funksjonell?
  • Fungerer søket hvis du bare kjenner brystfargen og nebbformen?
  • Har det noen betydning om du for eksempel skriver "tre" eller "3"?
  • Hva skjer hvis noen skriver mellomrom etter komma?
  • Bytt søkeprogram med en medelev, og søk på en art.

    • Får dere treff?
    • Er kjennetegnene på artene klare nok?
  • Kan du legge til egenskaper for farge på føttene eller ryggfarge? Husk å gjøre endringer både i databasen og i koden for søket.

  • Kan du bruke programmet til å lage en søkbar database for blomster, trær, fisker eller annet?