Programmering nivå 2

Kap 4.5 – Miniuppgift: filbaserat program

Bygg ett program som sparar och läser data från en textfil.

Mål med lektionen

När du har arbetat klart med denna uppgift ska du:

  • Använda filhantering för att spara och läsa data i ett Pythonprogram.
  • Strukturera ett mindre program med funktioner och undantagshantering.
  • Skapa användarinteraktion genom menyer och val.

Så här lär du dig bäst

Börja med att skapa ett enkelt menysystem. Använd funktioner för varje delmoment och inkludera try/except-block där användaren matar in data. Planera innan du kodar: vilken information ska sparas, var lagras den och hur läser du tillbaka den?

Uppgift: Receptsamling

Skapa ett program som låter användaren:

  1. Lägga till ett nytt recept med namn och ingredienser.
  2. Visa alla sparade recept.
  3. Spara recept i en textfil, till exempel recept.txt.
  4. Läsa in recept från filen vid programstart eller när användaren vill visa recepten.

Krav

  • Använd en fil för lagring i textformat.
  • Skapa minst tre funktioner, till exempel lägga_till_recept, visa_recept och spara_recept.
  • Använd try/except vid inläsning från fil.
  • Programmet ska kunna köras flera gånger utan att tidigare data försvinner.

Mallkod att utgå från

def visa_meny():
    print("1. Lägg till recept")
    print("2. Visa recept")
    print("3. Avsluta")

def main():
    while True:
        visa_meny()
        val = input("Välj ett alternativ: ")

        if val == "1":
            pass  # lägga till recept
        elif val == "2":
            pass  # visa recept
        elif val == "3":
            break
        else:
            print("Ogiltigt val!")

if __name__ == "__main__":
    main()

Tips

  • Börja smått, exempelvis med att spara endast namnet på ett recept.
  • Lägg till ingredienser som en lista eller som en rad per recept.
  • Testa programmet genom att stänga och öppna det igen. Finns recepten kvar?

Sammanfattning

  • Du har tränat på filhantering, programstruktur och användarinteraktion.
  • Du har använt funktioner och undantag för att skapa ett mer robust program.
  • Du har tillämpat dina kunskaper i en konkret och verklighetsnära uppgift.

Lösningsförslag: Receptsamling

RECEPTFIL = "recept.txt"

def lägga_till_recept():
    namn = input("Vad heter receptet? ")
    ingredienser = input("Ange ingredienser (komma-separerade): ")
    meddelande = f"{namn}|{ingredienser}\n"

    try:
        with open(RECEPTFIL, "a") as fil:
            fil.write(meddelande)
        print("Recept sparat.")
    except Exception as e:
        print(f"Något gick fel: {e}")

def visa_recept():
    try:
        with open(RECEPTFIL, "r") as fil:
            rader = fil.readlines()

        if not rader:
            print("Inga recept hittades.")
            return

        for rad in rader:
            namn, ingredienser = rad.strip().split("|")
            print(f"\nRecept: {namn}")
            print("Ingredienser:")

            for ing in ingredienser.split(","):
                print(f"- {ing.strip()}")

    except FileNotFoundError:
        print("Filen med recept finns inte ännu.")
    except Exception as e:
        print(f"Fel vid läsning: {e}")

def visa_meny():
    print("\nMeny:")
    print("1. Lägg till recept")
    print("2. Visa recept")
    print("3. Avsluta")

def main():
    while True:
        visa_meny()
        val = input("Välj ett alternativ: ")

        if val == "1":
            lägga_till_recept()
        elif val == "2":
            visa_recept()
        elif val == "3":
            print("Programmet avslutas.")
            break
        else:
            print("Ogiltigt val, försök igen.")

if __name__ == "__main__":
    main()

Funktioner i lösningen

  • lägga_till_recept() - Sparar recept i formatet Receptnamn|ing1,ing2,....
  • visa_recept() - Läser filen, delar upp varje rad och skriver ut innehållet.
  • main() - Styr menyval och programflöde.

Lösningen är enkel men visar strukturerad kod, användning av try/except för felhantering och filhantering med append och readlines().

Tillbaka till Kapitel 4