-
-
Save alisonamerico/e10c4673ffb6e9ec14824757df78b18d to your computer and use it in GitHub Desktop.
""" | |
Exercício: | |
1 - Escreva um programa que recebe como entrada um username e retorna as seguintes informações: | |
website | |
hemisfério (norte ou sul) | |
A fonte de dados original é a seguinte API: | |
https://jsonplaceholder.typicode.com/users | |
Para consultar as informações dela, use a biblioteca requests. | |
Para ler um parâmetro na entrada do seu programa veja a documentação do sys.argv: | |
https://docs.python.org/3/library/sys.html#sys.argv | |
Agora que o seu programa consulta informações na API e mostra os dados de | |
interesse na tela, adicione um cache para evitar uma consulta quando a | |
informação for conhecida. | |
Existe alguns serviços que podem ser usados para isso, geralmente um | |
banco de dados ou algum serviço específico de cache | |
como o Memcached. | |
Para este exercício você pode usar um arquivo CSV. | |
CSV (comma-separated values) é um formato de arquivo que possui valores | |
separados por vírgulas ou algum outro separador. | |
Um exemplo com alguns dados referentes à este exercício: | |
mail,website,hemisferio,username | |
[email protected],hildegard.org,sul,Bret | |
[email protected],anastasia.net,sul,Antonette | |
Na biblioteca padrão do Python existe um módulo para ler e escrever | |
arquivos CSV: | |
https://docs.python.org/3/library/csv.html | |
Regras | |
Sua solução deve funcionar com Python 3.6 ou mais recente. | |
Use a biblioteca requests para fazer requisições na API. | |
Seu programa deve usar o arquivo CSV como cache: | |
O arquivo começa vazio | |
Ao executar o programa uma vez para um determinado username deve adicionar apenas os dados do username consultado | |
Em consultas futuras desse username, deve retornar os dados do CSV, sem fazer consulta na API | |
""" | |
# import os | |
# import sys | |
# import csv | |
# import requests | |
# import pytest | |
# if __name__ == "__main__": | |
# if len(sys.argv) > 1: | |
# username = sys.argv[1] | |
# # Seu código entra aqui | |
# else: | |
# print("passe um username") | |
======================================================================================================================== | |
# main.py | |
import csv | |
import os | |
import sys | |
import requests | |
from typing import Dict | |
def consultar_api(username: str) -> Dict: | |
"""Função que lista usuários e ao informar um usuário deve retornar: | |
- website | |
- hemisfério (norte ou sul) | |
Arguments: | |
username {str} -- lista um usuário | |
Returns: | |
Dict -- Retorna um dicionário com os dados desse usuário: e-mail, website e hemisfério | |
""" | |
querystring = {"username": username} | |
response = requests.get( | |
"https://jsonplaceholder.typicode.com/users", params=querystring | |
) | |
if response.status_code != 200: | |
raise requests.HTTPError(f"Ocorreu erro, {response.status_code}") | |
json_response = response.json() | |
if len(json_response) == 0: | |
raise requests.HTTPError("Arquivo está vazio!") | |
result = { | |
"email": json_response[0]["email"], | |
"website": json_response[0]["website"], | |
"hemisferio": "sul" if json_response[0]["lat"].startswith("-") else "norte", | |
} | |
return result | |
def registra_cache(username: str, response: Dict) -> bool: | |
"""Função que grava informações no CSV | |
Arguments: | |
username {str} -- nome de usuário | |
response {Dict} -- | |
Returns: | |
bool -- returna os dados que foram gravados no csv | |
""" | |
with open("cached_users.csv", "w", newline="") as csvfile: | |
fieldnames = [ | |
"email", | |
"website", | |
"hemisferio", | |
"username", | |
"address", | |
"name", | |
"phone", | |
"id", | |
"company", | |
] | |
csv_writer = csv.DictWriter(csvfile, fieldnames=fieldnames, delimiter=",") | |
csv_writer.writeheader() | |
for line in response: | |
csv_writer.writerow(line) | |
return True | |
def consultar_cache(username: str) -> Dict: | |
"""Função que ler informações no CSV | |
Arguments: | |
username {str} -- nome de usuário | |
Returns: | |
[Dict] -- retorna um dicionário com as informações já armazenadas. | |
""" | |
with open("cached_users.csv", newline="") as csvfile: | |
csv_reader = csv.DictReader(csvfile) | |
for line in csv_reader: | |
print(line["email"], line["website"], line["hemisferio"], line["username"]) | |
# 2. Procura username no CSV | |
return {} | |
def consultar_username(username: str) -> Dict: | |
"""Função que consulta um username específico dentro do "cached_users.csv". | |
Arguments: | |
username {str} -- nome do usuário | |
Returns: | |
Dict -- retorna um usuário | |
""" | |
response = consultar_cache(username) | |
if not bool(response): | |
response = consultar_api(username) | |
registra_cache(username, response) | |
return response | |
if __name__ == "__main__": | |
if len(sys.argv) > 1: | |
username = sys.argv[1] | |
response = consultar_username(username) | |
print("email:", response["email"]) | |
print("website:", response["website"]) | |
print("hemisferio:", response["hemisferio"]) | |
else: | |
print("passe um username") | |
=============================================================================================================== | |
# vamo_ver.py | |
## Assim isolado funciona: | |
import csv | |
import requests | |
response = requests.get("https://jsonplaceholder.typicode.com/users").json() | |
with open("cached_users.csv", "w", newline="") as csvfile: | |
fieldnames = [ | |
"email", | |
"website", | |
"hemisferio", | |
"username", | |
"address", | |
"name", | |
"phone", | |
"id", | |
"company", | |
] | |
csv_writer = csv.DictWriter(csvfile, fieldnames=fieldnames, delimiter=",") | |
csv_writer.writeheader() | |
for line in response: | |
csv_writer.writerow(line) | |
Estou na função "registra_cache", tentanndo criar o arquivo "cached_users.csv", com base no meu response "response = requests.get("https://jsonplaceholder.typicode.com/users", params=querystring)" que está na função "consultar_api".
Dúvida:
Como acessar os dados direto da api para criar o arquivo.csv?
-
Toda vez q vc for gravar uma entrada nova de "cache" vc vai gravar uma linha de cabeçalho?
-
Vc não acessa "dados direto da api", o item a cachear é recebido na assinatura do método
registra_cache
: é o parametroresponse
!
Parece q não registrou meu comentário, e como vc vai ver logo, vou correr aqui.
# vamo_ver.py
Você está perdendo o foco do valor que precisa gerar, cuidado com isso.
Na primeira "entrega" fizemos:
- consultar_api()
- imprimir()
Lembra?
Depois evoluímos para algo do tipo:
- consultar_cache()
- se resultado, imprimir() e encerrar
- consultar_api()
- registrar_cache()
- imprimir()
Nesse ultimo exemplo, vc carregou a API inteira pro cache, e não foi isso que foi solicitado.
Uh oh!
There was an error while loading. Please reload this page.