2
votes

Comment charger un objet Json Twitter dans Python

Je veux charger un json extrait de l'API Twitter dans Python. Ci-joint un exemple d'objet json:

dat=list()
with open ('data_tweets_E2.json', 'r') as f:
    for l in f.readlines():
        if not l.strip (): # skip empty lines
            continue

        json_data = json.loads (l)
        dat.append(json_data)

J'essaye le code suivant:

JSONDecodeError: Extra data: line 3 column 1 (char 2149)

Mais j'obtiens l'erreur suivante:

with open('tweets.json') as tweet_data:
    json_data = json.load(tweet_data)

Malheureusement, il ne m'est pas possible d'éditer trop l'objet json, car il est vraiment gros. J'ai besoin de comprendre comment lire cela en Python. Toute aide serait grandement appréciée!

Edit: Cela fonctionne avec le code suivant:

{"created_at":"Mon Apr 22 18:17:09 +0000 2019","id":1120391103813910529,"id_str":"1120391103813910529","text":"On peut dire que la base de cette 8e saison est en place \ud83d\ude4c #GOTS8E2","source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":243071138,"id_str":"243071138","name":"Mr B","screen_name":"skeyos","location":"Namur","url":null,"description":null,"translator_type":"none","protected":false,"verified":false,"followers_count":197,"friends_count":1811,"listed_count":6,"favourites_count":7826,"statuses_count":8044,"created_at":"Wed Jan 26 06:49:05 +0000 2011","utc_offset":null,"time_zone":null,"geo_enabled":true,"lang":"fr","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"1DA1F2","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/493833348167770112\/aGLGemZ5_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/493833348167770112\/aGLGemZ5_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/243071138\/1406574068","default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"quote_count":0,"reply_count":0,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"GOTS8E2","indices":[59,67]}],"urls":[],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"filter_level":"low","lang":"fr","timestamp_ms":"1555957029666"}

{"created_at":"Mon Apr 22 18:17:14 +0000 2019","id":1120391124722565123,"id_str":"1120391124722565123","text":"...


2 commentaires

Chaque ligne contient un nouvel objet, essayez donc de les analyser ligne par ligne. Utilisez également charges si vous analysez à partir d'une chaîne.


Veuillez essayer d'utiliser mon code ci-dessous, je vous ai également aidé avec le DataFrame. L'erreur que vous avez obtenue était due à une syntaxe incorrecte de votre fichier json. Mais le code est correct. Essayez donc 1 objet json et vérifiez vos erreurs.


3 Réponses :


1
votes

Chaque ligne contient un nouvel objet, alors essayez de les analyser ligne par ligne.

import json

with open ('tweets.json', 'r') as f:
    for l in f.readlines():
        if not l.strip (): # skip empty lines
            continue

        json_data = json.loads (l)
        print (json_data)


2 commentaires

Merci, il a chargé. Bien que lorsque je tape json_data, seul le dernier tweet apparaît. Comment stocker tous les tweets dans un seul objet? Aussi, si je pouvais convertir le format json en dataframe, ce serait génial!


À chaque itération, json_data stocke un objet. Poussez-les dans une liste ou quelque chose si vous voulez avoir accès à tous.



1
votes

Chaque ligne contient un objet json distinct, analysez-les et stockez-les dans une liste:

with open('tweets.json', 'r') as tweet_data:
    values = [json.loads(line) for line in tweet_data.readlines() 
              if not line.strip()]


0 commentaires

2
votes

Voici le code. Vous devez d'abord installer Pandas bien sûr. Si la solution vous a aidé, veuillez cocher cette réponse avec la coche verte.

import json
import pandas as pd

with open('tweets.json') as json_file:
    data_list = json.load(json_file)

tweet_data_frame = pd.DataFrame.from_dict(data_list)
print(tweet_data_frame)
print(data_list)

Comme vous pouvez le voir, print (data_list) imprime une liste et print (tweet_data_frame) imprime le dataframe. p >

Si vous voulez voir les types de ces variables, utilisez simplement type () print(type(data_list))

Important: Quoi J'ai essayé de vous dire que votre fichier JSON a un mauvais format et beaucoup d'erreurs. Si vous avez plus d'objets JSON, ils doivent être dans le tableau [{"example": "value"}, {"example": "value"}] . Votre fichier JSON contient des erreurs. Essayez-le avec un fichier JSON différent.


4 commentaires

Salut, le seul problème, j'ai une liste au lieu d'un dictionnaire maintenant (voir la modification dans la question). Y a-t-il un moyen de faire cela avec une liste? Ou si je pouvais ajouter les données dans un dictionnaire en premier lieu qui fonctionne aussi, mais je ne sais pas comment.


J'ai essayé votre code, mais j'ai rencontré le même JSONDecodeError. C'est pourquoi j'ajoute toutes les données dans une liste. S'il existe un moyen de charger toutes les données dans un dictionnaire au lieu d'une liste, cela fonctionne aussi pour moi


@ArtTatum D'accord, j'ai donc édité mon code. Essayez-le avec un fichier JSON différent et vous découvrirez que vous avez un fichier endommagé. Espérons que cela aide. S'il vous plaît laissez-moi savoir si c'est ce que vous recherchez. :)


Merci, je vois ce que vous vouliez dire. Heureusement, je n'ai pas besoin de ces colonnes avec les mauvaises données.