2017-01-06 1 views
0

Je tente d'insérer un fichier JSON dans une image de données. Mon actuellement le code buggé crée le fichier JSON par la méthode suivante:Erreur lors de l'insertion d'un fichier JSON dans une image de base pandas

fname = 'python.json' 
with open(fname, 'r') as f, open('sentiment.json', 'w') as s: 
for line in f: 
    tweet = json.loads(line) 
    # Create a list with all the terms 
    tweet_words = tweet['text'] 
    output = subprocess.check_output(['curl', '-d', "text=" + tweet_words.encode('utf-8'), 'http://text-processing.com/api/sentiment/']) 
    s.write(output+"\n") 

Il écrit en sortie « » sentiment.json demandé à l'API text-processing.com. Je puis charger le JSON en utilisant:

def load_json(file, skip): 
with open(file, 'r') as f: 
    read = f.readlines() 
    json_data = (json.loads(line) for i, line in enumerate(read) if i%skip==0) 
return json_data 

Et puis construire la trame de données en utilisant:

sentiment_df = load_json('sentiments.json', 1) 

data = {'positive': [], 'negative': [], 'neutral': []} 
for s in sentiment_df: 
     data['positive'].append(s['probability']['pos']) 
     data['negative'].append(s['probability']['neg']) 
     data['neutral'].append(s['probability']['neutral']) 

df = pd.DataFrame(data) 

Erreur: ValueError: Aucun objet JSON pourrait être décodé

j'ai parcouru plusieurs questions connexes , et basé sur la réponse here, de WoodrowShigeru, je soupçonne qu'il peut avoir quelque chose à voir avec mon encodage en 'utf-8' dans le premier bloc de code.

Est-ce que quelqu'un connaît une bonne solution? Ou au moins fournir des indications? Merci les gars!

Modifier 1

Screen of 'sentiment.json'

Répondre

0

Votre capture d'écran ne sont pas un json valide en tant que récipient doit contenir tous les éléments de ligne séparés par des virgules. Cependant, le défi est que votre appel de ligne de commande renvoie une chaîne, output, que vous écrivez ensuite dans un fichier texte. Vous devez créer une liste de dictionnaires qui est ensuite transférée dans un fichier json avec json.dumps(). Pensez à le faire en lançant une chaîne de ligne de commande dans un dictionnaire avec ast.literal_eval() lors de la première lecture du fichier texte. Ensuite, ajoutez chaque dictionnaire à une liste:

import ast 

fname = 'python.json' 
dictList = [] 
with open(fname, 'r') as f, open('sentiment.json', 'w') as s: 
    for line in f: 
     tweet = json.loads(line) 
     # Create a list with all the terms 
     tweet_words = tweet['text'] 
     output = subprocess.check_output(['curl', '-d', "text=" + tweet_words.encode('utf-8'), 
             'http://text-processing.com/api/sentiment/']) 
     # CONVERT STRING TO DICT AND APPEND TO LIST 
     dictList.append(ast.literal_eval(output)) 

    # CONVERT TO JSON AND WRITE TO FILE 
    s.write(json.dumps(dictList, indent=4)) 

À partir de là, lire le fichier JSON dans une trame de données de pandas géants avec json_normalize. utilise les données ci-dessous par exemple:

Sentiment json file

import json 
import pandas as pd 

with open('sentiment.json') as f: 
    data = json.load(f) 

df = pd.io.json.json_normalize(data) 
df.columns = [c.replace('probability.', '') for c in df.columns] 
print(df) 

#  label  neg neutral  pos 
# 0  pos 0.003228 0.204509 0.571945 
# 1  pos 0.053094 0.097317 0.912760 
# 2  pos 0.954958 0.163341 0.917178 
# 3  pos 0.784391 0.646188 0.955281 
# 4  pos 0.203419 0.050908 0.490738 
# 5  neg 0.122760 0.705633 0.219701 
# 6  neg 0.961012 0.923886 0.335999 
# 7  neg 0.368639 0.562720 0.124530 
# 8  neg 0.566386 0.802366 0.825956 
# 9  neg 0.115536 0.512605 0.784626 
# 10 neutral 0.202092 0.741778 0.567957 
# 11 neutral 0.837179 0.051033 0.509777 
# 12 neutral 0.333542 0.085449 0.610222 
# 13 neutral 0.798188 0.248258 0.218591 
# 14 neutral 0.873109 0.469737 0.005178 
# 15  pos 0.916112 0.313960 0.750118 
# 16  neg 0.810080 0.852236 0.212373 
# 17 neutral 0.748280 0.039534 0.323145 
# 18  pos 0.274492 0.461644 0.984955 
# 19  neg 0.063772 0.793171 0.631172