
On Day 2, we created a Coin Flip App to demonstrate Import, If-Else, For Loop, Red From User Input, Random Number, and Logging.
Today, let’s create a Python Quiz App that should be useful for studying for quizzes. This project demonstrates a few more core Python concepts (Dictionary, Function, Read from a File).
Below are the steps to create the Python Quiz App:
- Step 1: Create a wordsdictionary, and randomly select an item to ask a question
- Step 2: Populate the wordsdictionary from a CSV file
- Step 3: Ask the user to choose which quiz to take, then randomly select a question from that quiz
- Step 4: Ask the user to select a quiz category, then ask randomly selected questions from a randomly selected quiz
- Step 5: Further clean up the code by creating a quiz_commonmodule
Step 1: Create a words dictionary, and randomly select an item to ask a question
Create a dictionary (named “words”) whose key is an English word and the value is its matching Spanish word.
Create a function (named “random_key”) that does not take any parameter. The random_key function would randomly select a key from the words dictionary and return the random key. This key is used to select a word from words and create a question.
Once both words and random_key are set up, let’s use them to add code to randomly pick a question and ask the user for an answer. The question will be asked like “Word for rojo: ” and the user is supposed to type the English word “red”.
To ask the question, we will select a key (English word, such as “red”) which will be the answer, and then ask the question with its matching value (Spanish word, such as “rojo”).
File: pythonquiz/quiz_step1.py
import random
# function to randomly pick a "key" for picking a question 
def random_key():
    # find all the keys, 'keys' now in a SET data structure
    keys = words.keys()
    # convert 'keys' to LIST
    keys = list(keys)
    # randomly select a key from 'keys'
    random_key = random.choice(keys)
    return random_key
# word dictionary 
words = {
    "red" : "rojo",
    "blue" : "azul",
    "water" : "aqua",
    "sky" : "cielo",  
    "love" : "amor",  
}
random_answer = random_key()
random_question = words[random_answer]
# ask and read user input
user_answer = input("Word for " + random_question + ": ")
user_answer = user_answer.strip()
if (user_answer == random_answer):
    print("correct")
else:
    print ("incorrect")
Step 2: Populate the words dictionary from a CSV file
Create a folder called “spanish”, and in that folder, add several CSV files that look like
File: pythonquiz/spanish/quiz1.csv
"water","aqua" "sky","cielo" "love","amor"
File: pythonquiz/spanish/quiz2.csv
"red","rojo" "white","blanco" "yellow","amarillo" "orange","anaranjado" "blue","azul" "teal","verde azulado" "green","verde" "black","negro" "brown","marrón" "pink","rosado" "purple","morado"
File: pythonquiz/spanish/quiz3.csv
"water","aqua" "ocean","oceano" "fish","pez" "squid","calamar" "shrimp","camaron" "sand","arena" "island","isla"
Then add a function called “read_from_file” which also takes an input parameter called file_name.
import random
import csv
# function to read the questions from a file 
def read_data_from_file(file_name):
    with open(file_name) as csv_file:
        # csv_file is the file handler
        # lines are all the lines from file
        lines = csv.reader(csv_file)
        for data_list in lines:
            question = data_list[0]
            question = question.strip()
            answer = data_list[1]
            answer = answer.strip()
            words[question] = answer
# function to randomly select a key from words
def random_key():
    # find all the keys
    keys = words.keys()
    keys = list(keys)
    random_key = random.choice(keys)
    return random_key
words = { }
word_file = "spanish/quiz1.csv"
read_data_from_file(word_file)
random_answer = random_key()
random_question = words[random_answer]
user_answer = input("Word for " + random_question + ": ")
user_answer = user_answer.strip()
if (user_answer == random_answer):
    print("correct")
else:
    print ("incorrect")
Step 3: Ask the user to choose which quiz to take, then randomly select a question from that quiz
import random
import csv
# function to read the questions from a file 
def read_data_from_file(file_name):
    with open(file_name) as csv_file:
        # csv_file is the file handler
        # lines are all the lines from file
        lines = csv.reader(csv_file)
        for data_list in lines:
            question = data_list[0]
            answer = data_list[1]
            words[question] = answer
# function to randomly select a key from words
def random_key():
    # find all the keys
    keys = words.keys()
    keys = list(keys)
    random_key = random.choice(keys)
    return random_key
words = { }
data_files_path = "spanish/"
# ask the user for quiz name
# open the file with name <data_files_path><quiz_name>.csv
# example: spanish/quiz1.csv
quiz_name = input("Pick a Quiz [quiz1, quiz2, quiz3] ")
word_file = data_files_path + quiz_name + ".csv"
read_data_from_file(word_file)
random_answer = random_key()
random_question = words[random_answer]
user_answer = input("Word for " + random_question + ": ")
if (user_answer == random_answer):
    print("correct")
else:
    print ("incorrect")
Step 4: Ask the user to select a quiz category, then ask randomly selected questions from a randomly selected quiz
import random
import csv
# function to read the questions from a file 
def read_data_from_file(file_name):
    with open(file_name) as csv_file:
        # csv_file is the file handler
        # lines are all the lines from file
        lines = csv.reader(csv_file)
        for data_list in lines:
            question = data_list[0]
            answer = data_list[1]
            words[question] = answer
# function to randomly select a key from words
def random_key():
    # find all the keys
    keys = words.keys()
    keys = list(keys)
    random_key = random.choice(keys)
    return random_key
words = { }
# ask the user for quiz type
print("Quiz Types: sat, spanish")
quiz_type = input("Enter quiz type: ")
data_files_path = quiz_type + "/"
# randomly select a file
random_file_num = random.randrange(1,3)
random_file_num = str(random_file_num)
word_file = data_files_path + "quiz" + random_file_num + ".csv"
read_data_from_file(word_file)
random_answer = random_key()
random_question = words[random_answer]
user_answer = input("Word for " + random_question + ": ")
if (user_answer == random_answer):
    print("correct")
else:
    print ("incorrect")
Step 5: Add support for different types of quizzes
To support different types of quizzes, create another folder
File: quiz_common.py
import random
import csv
# function to read the questions from a file 
def read_data_from_file(words, file_name):
    with open(file_name) as csv_file:
        # csv_file is the file handler
        # lines are all the lines from file
        lines = csv.reader(csv_file)
        for data_list in lines:
            question = data_list[0]
            answer = data_list[1]
            words[question] = answer
# function to randomly select a key from words
def random_key(words):
    # find all the keys
    keys = words.keys()
    keys = list(keys)
    random_key = random.choice(keys)
    return random_key
File: quiz_step5.py
import random
import quiz_common
words = { }
# ask the user for quiz type
print("Quiz Types: sat, spanish")
quiz_type = input("Enter quiz type: ")
data_files_path = quiz_type + "/"
# randomly select a file
random_file_num = random.randrange(1,3)
random_file_num = str(random_file_num)
word_file = data_files_path + "quiz" + random_file_num + ".csv"
quiz_common.read_data_from_file(words, word_file)
random_answer = quiz_common.random_key(words)
random_question = words[random_answer]
user_answer = input("Word for " + random_question + ": ")
if (user_answer == random_answer):
    print("correct")
else:
    print ("incorrect")
Source Code
The source code for this blog is available at https://github.com/jess1sd/pythonquiz