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()