Lab 3: Uppgiftsbeskrivning

I denna labb skall ni kryptera textfiler och skapa ett frågesportspel.

Nyckelkoncept: Filhantering och Felhantering

 

Uppgift 0 (förberedelser)

Ladda ned följande zip-fil och packa upp den (lab3_files.zip Ladda ner lab3_files.zip). Den innehåller följande filer

  • text_encryption_function.py
  • namn.csv
  • quiz.csv

Skapa en ny fil my_module.py, där du skriver din egen kod.

Uppgift 1: Kopiera textfil

Skapa funktionen copy_text_file(in_file, out_file) som läser in filen in_file, och skriver ut en kopia i en fil som heter out_file.

I denna uppgift kan ni anta att filen in_file existerar och är på rätt format.

Testa er funktion genom att köra: copy_text_file("namn.csv", "my_copy.csv")

Uppgift 2: Kryptera textfil

Skapa funktionen encrypt_file(in_file, out_file) läser in filen in_file, krypterar den med hjälp av modulen text_encryption_function.py, samt skriver ut resultatet i en fil som heter out_file.

Notera att funktionen för kryptering, encrypt, redan finns, men skall anropas av er från my_module.py.

I denna uppgift kan ni anta att filen in_file existerar och är på rätt format.

Testa er funktion genom att köra encrypt_file("namn.csv", "secret_names.csv")

Notera att lösningen på denna uppgift är mycket lik lösningen på Uppgift 1 ovan.

Uppgift 3: Kryptering med felhantering

Skapa en funktion user_dialogue() som ber om namn på två filer, och kör er egen funktion encrypt_file (från Uppgift 2) på dessa två filer. Er nya funktion (user_dialogue) skall ha felhantering, och fånga upp om in_file inte existerar, och i sådana fall fråga efter ett nytt filnamn. Se följande exempel:

Name of new encrypted file:out_file.txt
Name of file to be encrypted:blaha.txt
That resulted in an input/output error, please try again! Details:FileNotFoundError(2, 'No such file or directory')
Name of file to be encrypted:namn.csv
Encryption completed!

Notera att felhanteringen skall ske i user_dialogue, trots att själva felet (om filen inte existerar) uppkommer i encrypt_file. Ni skall inte ändra i encrypt_file.

Notera även att utskriften kan variera något vad gäller det som kommer efter "Details:", t.ex. [Errno 2] No such file or directory: 'blaha.txt', eller liknande är helt ok.

Uppgift 4: Heltal med felhantering

Skapa en funktion get_int_input(prompt_string) som gör ungefär samma sak som 

int(input(prompt_string)), men med felhantering. Följande exempel visar hur det kan se ut om man kör get_int_input("Ange ett tal:")

Ange ett tal:hej
Svara med ett heltal!
Ange ett tal:åtta
Svara med ett heltal!
Ange ett tal:4

Notera att lösningarna till uppgift 3 och 4 ovan ofta är allt som behövs för att gå från betyg D till C på P-uppgiften.

Uppgift 5: Ett Quiz-spel

Skapa en quiz-spel som beter sig enligt följande:


----------------------------------------
Hello and welcome to the quiz!
----------------------------------------
Vad heter Norges huvudstad?
Alternativ 1: Bergen , Alternativ 2: Oslo , Alternativ 3: Köpenhamn
Vilket är ditt svar? (1,2,3):blaha
Svara med ett heltal!
Vilket är ditt svar? (1,2,3):3
Fel, det rätta svaret är: Oslo
----------------------------------------
Vad står ABBA för?
Alternativ 1: Smarrig Sill , Alternativ 2: Kalle och Lisa , Alternativ 3: Agneta Björn Benny Annefrid
Vilket är ditt svar? (1,2,3):3
Rätt, det är: Agneta Björn Benny Annefrid

I denna uppgift kan ni använda följande lista av listor för själva frågorna

short_quiz_list_of_lists = [['Vad heter Norges huvudstad?', 'Oslo', 'Bergen', 'Köpenhamn'],
['Vad står ABBA för?', 'Agneta Björn Benny Annefrid', 'Kalle och Lisa', 'Smarrig Sill']]
Notera att varje element i listan är en lista på formatet [fråga, alt1, alt2, alt3], där alternativ 1 alltid är det rätta.

Ni skall alltså skriva en funktion run_quiz(quiz_list_of_lists) som

  • skriver ut en tjusig rubrik "Hello and welcome..."
  • skriver ut en fråga och alternativen
  • be om ett svar med hjälp av er funktion i Uppgift 4
  • berätta om det var rätt eller fel 
  • (osv så länge det finns nya frågor)

Notera att det blir lite tråkigt om alternativ 1 alltid är rätt, så för att göra det mer spännande kan ni blanda om alternativen (t.ex. med random.shuffle(list)), men det är inte ett krav.

Uppgift 6: Inläsning av data till Quiz-spel med felhantering

Skapa en funktion get_quiz_list_handle_exceptions() som läser in en fil av typen quiz.csv och skapar en lista av listor av typen short_quiz_list_of_lists.

Användbara funktioner är

  • string.strip() - tar bort skräptecken
  • string.split(";") - delar upp sträng separerad av ";" i lista

Felhanteringen skall fånga upp både icke-existerande filer, och filer som inte innehåller rader med fyra delar separerade av ;

Exempel på användardialog:

Name of quiz-file: hejsan
That resulted in an input/output error, please try again!
Name of quiz-file: namn.csv
The file is not on the proper format. There needs to be four strings, separated by ; in each line of the file.
Name of quiz-file: quiz.csv

Uppgift 7: Quiz-spel med data från fil och felhantering

Kombinera uppgift 5 och 6 till ett tjusigt Quiz-spel. Lägg till en fråga i filen quiz.csv och se till att den kommer med i spelet. 


Name of quiz-file: namn.csv
The file is not on the proper format. There needs to be four strings, separated by ; in each line of the file.
Name of quiz-file: quiz.csv
----------------------------------------
Hello and welcome to the quiz!
----------------------------------------
Vad heter Norges huvudstad?
Alternativ 1: Köpenhamn , Alternativ 2: Oslo , Alternativ 3: Bergen
Vilket är ditt svar? (1,2,3):haha
Svara med ett heltal!
Vilket är ditt svar? (1,2,3):2
Rätt, det är: Oslo
----------------------------------------
Vad står ABBA för?
Alternativ 1: Kalle och Lisa , Alternativ 2: Agneta Björn Benny Annefrid , Alternativ 3: Smarrig Sill
Vilket är ditt svar? (1,2,3):1
Fel, det rätta svaret är: Agneta Björn Benny Annefrid
----------------------------------------
När dog Karl XII?
Alternativ 1: 1718 , Alternativ 2: 1818 , Alternativ 3: 1717
Vilket är ditt svar? (1,2,3):

Uppgift 8: Json-filer

Lägg till import json längst upp i filen och kör koden nedan. Vad gör den? Vad är skillnaden på quiz.csv och den fil som skapas nedan? Vilken version gillar ni bäst?

ql = get_quiz_list_handle_exceptions()
json_string = json.dumps(ql, indent=2)
fo = open("quiz.json", "w")
fo.write(json_string)
fo.close()