I am learning Python (about 6 months in, sporadically) and today I decided to write a script to download JSON information from an API.
To start, I wrote a one-page script with a few functions.
The script does the following:
- The user enters the script on the terminal with a search value.
- The script gets the response information from the Star Wars API (https://swapi.co). This is an open API, so I don't need any keys or tokens.
- If the API returns one value, the information is displayed immediately.
- If the API returns several values, the script prompts the user to make a choice. Then the information is displayed.
Right now, the script only works for people in the SWAPI (e.g., Luke Skywalker).
Any feedback on my code would be helpful.
#!/usr/bin/python3
'''Script to get information from https://swapi.co/'''
import requests
import json
import sys
#TODO: Print useful information such as movie titles or names of worlds instead of showing links
#Break up URL to allow for more dynamic searching in the future. Right now, script only handles the people parameter when getting info from the API.
UNDERLINE_LEN = 30
def show(data, index=0):
    '''
        Displays an individual Swapi object.
        data = data retrieved from api
        index = which entry to select. Default is 0 for single item lists.
    '''
    info = data['results'][index]
    print()
    print('-' * UNDERLINE_LEN)
    print("Name : {0}\n{1}".format(data['results'][index]['name'], '-' * UNDERLINE_LEN))
    for k, v in info.items():
        if type(v) is list:
            counter = 0
            print(k, ':')
            for j in v:
                print("\t{0}".format(v[counter]))
                counter += 1
        else: 
            if k != 'name':
                print(k, ':', v)
def show_choices(data):
    '''Shows a list of Swapi objects and prompts users to select an object [integer]'''
    info = data['results']
    counter = 0
    for i in info:
        print("[{0}] {1}".format(counter + 1, data['results'][counter]['name']))
        counter += 1
    print()
    choice = int(input("Which item would you like to view? "))
    try:
        show(data, choice - 1)
    except IndexError as ie:
        print(ie)
def grab():
    '''Main function.'''
    try:
        search = sys.argv[1]
        url = 'https://swapi.co/api/people/?search={0}'.format(search)      #need to divide url to make search process more dynamic
        r = requests.get(url)
        data = json.loads(r.text)
        if data is not None:
            numResults = int(data['count'])
            txt = "results"
            if numResults == 1:
                txt = "result"    
            resText = "{0} {1} found for search parameter '{2}'".format(numResults, txt, search)
            print(resText)
            if numResults == 1:
                show(data)
            else:
                show_choices(data)      
    except Exception as e:
        print(e)
grab()

