Jump to content

Como tratar um arquivo que vem de uma API


Ir para a Solução Solucionado por Thanael,

Postagens Recomendadas

  • Pessoal da TecnoSpeed
Postado

Olá @alessandro.cardoso tudo bem ?

Uma forma simples é transformar esses dados em um DataFrame do Pandas.

Segue a lógica para fazer isso.

  1. Realiza o Request ai na API.
  2. Converte a resposta em JSON.
  3. Cria o DataFrame.

Exemplo de código:

import requests 
import pandas as pd
import json

# Realiza a Requisição e converte em JSON - Ai precisará adaptar headers e parametros da API caso tenha
req = requests.get('URL DA API').json()

# Cria o DataFrame
df = pd.DataFrame(req['data'])

Exemplo da estrutura final.

image.png

Após ter o DataFrame você pode manipulá-lo como desejar, inserir em banco de dados, criar visualizações entre outras ações.

Espero que isso lhe ajude, caso contrário estou à disposição para auxiliar.

 

  • Amei 1
Postado

Meu amigo

 

Eu fiz :

 

import requests
import json

req = requests.get('http://ofertas.silcarpneus.com.br/json/lojas.php?key=silcarpneus2023@').json()
print(req)

Ele me retornou um erro :

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 3 (char 2)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Python\Contrato\Teste.py", line 5, in <module>
    req = requests.get('http://ofertas.silcarpneus.com.br/json/lojas.php?key=silcarpneus2023@').json()
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Contrato\venv\Lib\site-packages\requests\models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 3 (char 2)

Process finished with exit code 1

 

  • Pessoal da TecnoSpeed
Postado

Boa tarde @alessandro.cardoso.

O problema está no formato que a API está retornando, pois ele acaba não sendo um formato válido para o JSON. Se olhar a estrutura vai perceber que o DATA ali deveria estar entre " " ou seja "data" para estar no formato correto 😕 

image.png

Porém, conseguimos tratar isso mesmo assim em python e com isso criar o DataFrame.

Segue abaixo como realizar isso.

import requests
import json
import pandas as pd

req = requests.get('http://ofertas.silcarpneus.com.br/json/lojas.php?key=silcarpneus2023@')

# Ajustar a envode do Texto
dados = req.content.decode('utf-8')

# Fazer um Slicing no Texto para obter somente uma parte dele ou seja obter o que está dentro de [ ]
# Exemplo: '{ data : [{"Loja":"F21 - Ribeirao Preto","agentsOnline":"1"}]}' vai retornar somente [{"Loja":"F21 - Ribeirao Preto","agentsOnline":"1"}]
json_string = dados[dados.find('['):-1]

# Transformar isso num formato válido para criar o DataFrame.
# Exemplo: '[{"Loja":"F21 - Ribeirao Preto","agentsOnline":"1"},{"Loja":"F32 - Ribeirao Preto","agentsOnline":"2"}]'
dados_formatados = json.loads(json_string)

# Criar o DataFrame
df = pd.DataFrame(dados_formatados)

Normalmente não é necessário realizar isso, pois as APIs já retornam no formato correto de JSON, porém também é simples tratar os dados.

Espero que seja isso que precise, caso contrario estou à disposição para ajudar. 👍

  • Amei 1
Postado

Bom dia

Eu entendi essa parte do trecho onde ele encontra "[" o obtem o que tá dentro dele, mas poderia me explicar o -1 ? Porque qualquer numero que eu coloque ai não muda nada

# Fazer um Slicing no Texto para obter somente uma parte dele ou seja obter o que está dentro de [ ] # Exemplo: '{ data : [{"Loja":"F21 - Ribeirao Preto","agentsOnline":"1"}]}' vai retornar somente [{"Loja":"F21 - Ribeirao Preto","agentsOnline":"1"}] json_string = dados[dados.find('['):-1]

Estou te perguntando isso porque estou tentando aprender e entender o código.

Obrigado

  • Curtir 1
  • Pessoal da TecnoSpeed
  • Solução
Postado

Bom dia.

Então o -1 é o índice para o Slicing (Esse número limita o que vamos visualizar na string)

Ele segue o padrão de variavel[ inicio : fim : step], podendo ser número positivo ou negativo.

  • Inicio vai definir de onde queremos que o texto inicie.
  • Fim vai definir até onde querermos que o texo vá.
  • Step vai definir que a quantidade será de N em N caracteres.

Aqui uma imagem para facilitar isso.image.png

Sugiro ler arr[0:3] como "quero mostrar o texto que inicia da casa 0 e vai até a casa 3", ou seja, PRE

Segue abaixo um artigo que explicar isso muito bem também. Python Strings Slicing esse slicing pode ser usado também em listas, sendo muito útil.

Espero que isso tenha esclarecido um pouco mais sobre o porquê utilizei o - 1, pois não queria que o texto fosse até o fim e sim somente até o ] que está na posição (-1) no texto.

 

  • Amei 1

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...