# Random Quote

In this post we will see how to display a random quote on the console. Every time you run the code, a different quote appears.

We will read the quotes from a file. We have multiple files and each file contains a bunch of quotes, one on each line 

### Directory structure
We will structure our app as follows.

```
app-root
  files
    Eckhart_Tolle.txt
    J_Krishnamurti.txt
  app.py
```

As you can see, the program *app.py* is in the root folder (anywhere in the file system). In the same folder, you will create a folder called *files* which will contain text files. Each file is named with author's name and contains that author's quotes one per line.

We will need two modules in our program
- *os* for locating the path of the files
- *random* for randomly picking an author and their quote, also picked randomly.

Given the path, the *os* module function *listdir()* retrieves a list of files. 

From each file in the list we will retrieve the author's name from the file name. It will be of the form ```author_name.txt```.

### Dictionary
We will then build a dictionary with author names for keys and a list of quotes for values.

The dictionary that we are going to build will be of the form:
```
d = {'a1':['q1', 'q2','q3'], 'a2':['q1','q2','q3']
```

### Random
This scheme allows us to randomly select authors and a quotation from their list of quotes.

We will use the *random.choice()* function to select one item from multiple options.

### The Program
The *main()* function fetches the list of files. It needs two helper functions to run the program:
- *get_author_names(file_list)* to retrieve author names from file names
- *get_quotes_dict(author_names, file_list)* to associate authors with their quotes

### File reading
The function *open()* is used to open and read files and directories in the file system. It follows the syntax:
```
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
```
It has several parameters. The file is of course required. It will throw an error if the file is not found at the path specified or it is not permitted to read. We have skipped the error handling and is left as an exercise to the developer.

We have specified 'r' mode for opening the file to read. We have also specified the Unicode encoding UTF-8, which is equivalent to the ASCII character set, since it is all in English only.

Here's the program in its entirety.

```
import os
import random

# store author names from file names (filename = author_name.txt)
def get_author_names(file_list):
    author_names = []
    for file in file_list:
        # get the name part
        path_tokens = file.split('\\')
        file_name = path_tokens[-1]
        # remove .txt from file name to get the author name
        file_name = file_name.split('.')[0]
        # remove underscore from author name
        file_name = file_name.replace("_", " ")
        author_names.append(file_name)
    return author_names

# build a dictionary of authors and their quotes of the form
# d = {'a1':['q1', 'q2','q3'], 'a2':['q1','q2','q3']} 
def get_quotes_dict(authors, files):
    # read files and store data
    quotes = {}
    # fetch authors
    author_files = list(zip(authors, files))
    # build quotes dictionary, created empty above
    for item in author_files:
        name, file_ = item
        f = open(os.getcwd()+'/files/'+file_, 'r', encoding='utf8')
        quotes[name] = f.readlines()
    return quotes

def main():
	file_list = os.listdir('./files')
	author_names = get_author_names(file_list)
	quotes = get_quotes_dict(author_names, file_list)
	# display random quote from random author
	r_author = random.choice(author_names)
	r_quote = random.choice(quotes[r_author])
	print("\n" + r_quote)
	print("\t" + r_author + "\n")


if __name__ == '__main__':
	main()
```

### Exercise
- Take input from the user for the name of the author. 
- Give options to choose author name. 
- Display a random quote from that author.

Enjoy coding with your own quotations!




