2017-10-09 10 views
1

J'utilise tweepy's Streamlistener pour collecter des données Twitter et le code que j'utilise génère un fichier JSONL avec un tas de métadonnées. Maintenant, je voudrais convertir le fichier dans un fichier CSV pour lequel j'ai trouvé un code pour cela. Malheureusement, j'ai couru dans la lecture d'erreur:Conversion de fichier JSONL en CSV - "JSONDecodeError: données supplémentaires"

raise JSONDecodeError("Extra data", s, end) 
json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 7833) 

J'ai lu dans d'autres discussions et je pense qu'il a quelque chose à voir avec json.loads ne pas être en mesure de traiter plusieurs parties de données dans le fichier JSON (ce qui est bien sûr le cas de mon fichier de liste json). Comment puis-je contourner ce problème dans le code? Ou dois-je utiliser une approche complètement différente pour convertir le fichier? (J'utilise python 3.6, et les tweets que je diffuse sont principalement en arabe).

__author__ = 'seandolinar' 
import json 
import csv 
import io 

''' 
creates a .csv file using a Twitter .json file 
the fields have to be set manually 
''' 

data_json = io.open('stream_____.jsonl', mode='r', encoding='utf-8').read() #reads in the JSON file 
data_python = json.loads(data_json) 

csv_out = io.open('tweets_out_utf8.csv', mode='w', encoding='utf-8') #opens csv file 


fields = u'created_at,text,screen_name,followers,friends,rt,fav' #field names 
csv_out.write(fields) 
csv_out.write(u'\n') 

for line in data_python: 

#writes a row and gets the fields from the json object 
#screen_name and followers/friends are found on the second level hence two get methods 
row = [line.get('created_at'), 
     '"' + line.get('text').replace('"','""') + '"', #creates double quotes 
     line.get('user').get('screen_name'), 
     unicode(line.get('user').get('followers_count')), 
     unicode(line.get('user').get('friends_count')), 
     unicode(line.get('retweet_count')), 
     unicode(line.get('favorite_count'))] 

row_joined = u','.join(row) 
csv_out.write(row_joined) 
csv_out.write(u'\n') 




csv_out.close() 

Répondre

0

Si le fichier de données se compose de plusieurs lignes, dont chacun est un objet JSON, vous pouvez utiliser un générateur pour décoder les lignes une à la fois.

def extract_json(fileobj): 
    # Using "with" ensures that fileobj is closed when we finish reading it. 
    with fileobj: 
     for line in fileobj: 
      yield json.loads(line) 

Les seules modifications apportées à votre code est que le fichier est lu data_json pas explicitement, et data_python est le résultat de l'appel extract_json plutôt que json.loads. Voici le code modifié:

import json 
import csv 
import io 

''' 
creates a .csv file using a Twitter .json file 
the fields have to be set manually 
''' 

def extract_json(fileobj): 
    """ 
    Iterates over an open JSONL file and yields 
    decoded lines. Closes the file once it has been 
    read completely. 
    """ 
    with fileobj: 
     for line in fileobj: 
      yield json.loads(line)  


data_json = io.open('stream_____.jsonl', mode='r', encoding='utf-8') # Opens in the JSONL file 
data_python = extract_json(data_json) 

csv_out = io.open('tweets_out_utf8.csv', mode='w', encoding='utf-8') #opens csv file 


fields = u'created_at,text,screen_name,followers,friends,rt,fav' #field names 
csv_out.write(fields) 
csv_out.write(u'\n') 

for line in data_python: 

    #writes a row and gets the fields from the json object 
    #screen_name and followers/friends are found on the second level hence two get methods 
    row = [line.get('created_at'), 
      '"' + line.get('text').replace('"','""') + '"', #creates double quotes 
      line.get('user').get('screen_name'), 
      unicode(line.get('user').get('followers_count')), 
      unicode(line.get('user').get('friends_count')), 
      unicode(line.get('retweet_count')), 
      unicode(line.get('favorite_count'))] 

    row_joined = u','.join(row) 
    csv_out.write(row_joined) 
    csv_out.write(u'\n') 

csv_out.close() 
+0

Je comprends votre contenu de réponse sage, mais techniquement comment puis-je configurer les données? Dois-je changer les lettres ou les chiffres en fonction de mes données? Aussi puis-je simplement inclure les deux premiers blogs de votre code suggéré en tant que premières lignes dans mon code? J'espère que ce ne sont pas des questions très naïves (débutant). Merci encore! (Au moment de l'exécuter, j'ai rencontré un message d'erreur de syntaxe pour ) –

+0

@JosephinaK. J'ai modifié la réponse pour supprimer l'exemple d'utilisation prêtant à confusion et ajouter une version complète de votre code. – snakecharmerb

+0

Ca marche !!! Merci beaucoup. J'ai dû faire de petits changements au code original (changer unicode en str et ajouter utf-8-sig pour excel) mais maintenant ça marche bien :) Une dernière chose: lors de l'ouverture du fichier, le lecteur semble confondre les textes qui incluent "=" et les sépare dans une colonne séparée, ce qui chamboule tout l'ordre. Une idée de comment surmonter cela? –