2017-11-27 1 views
-1

Ich versuche, JSON Antwort für Tonanalyse von Watson API zu speichern.csv.Error: Sequenz erwartet

Ich möchte nur die Werte von ton_name als Kopfzeilen speichern und Werte jeder Daten in jeder CSV-Zeile.

import csv 

import json 



infile=open('oobar.json', "rb") 

json_s=infile.read() 

outfile=open("watsf.csv","wb") 

writer=csv.writer(outfile) 

count = 0 


for data in(json.loads(json_s)): 
    categories = data['document_tone'] 
    for category in categories['tone_categories']: 
     for tone in category['tones']: 
      if count == 0: 
       header = tone.values()[0] 
       writer.writerow(header) 
       count += 1 
      writer.writerow(tone.values()[1]) 
infile.close() 
outfile.close() 

i ist eine csv wie diese

enter image description here

die Antwort von Watson-API zu erhalten hofft, wie diese

[ 
    { 
    "document_tone": { 
     "tone_categories": [ 
     { 
      "category_id": "emotion_tone", 
      "tones": [ 
      { 
       "tone_name": "Anger", 
       "score": 0.068227, 
       "tone_id": "anger" 
      }, 
      { 
       "tone_name": "Disgust", 
       "score": 0.035456, 
       "tone_id": "disgust" 
      }, 
      { 
       "tone_name": "Fear", 
       "score": 0.043625, 
       "tone_id": "fear" 
      }, 
      { 
       "tone_name": "Joy", 
       "score": 0.779054, 
       "tone_id": "joy" 
      }, 
      { 
       "tone_name": "Sadness", 
       "score": 0.054364, 
       "tone_id": "sadness" 
      } 
      ], 
      "category_name": "Emotion Tone" 
     } 
     ] 
    } 
    } 
] 

EDIT

writer.writerow war t wogende Error: sequence expected Fehler.

+0

Versuchen Sie 'writer.writerow ([tone.values ​​() [1]])'. 'writerow' erwartet eine Sequenz (eine Liste ist eine Sequenz) – roganjosh

Antwort

0

In der von Ihnen bereitgestellten JSON ist ein Fehler aufgetreten (eine geschweifte Klammer fehlt).

So konnte ich Ihren Code beheben, obwohl ich nicht sicher bin, ob dies die Lösung ist, die Sie erwartet haben.

Durch Hinzufügen writer.writerow([tone.values()[1]]) anstelle von writer.writerow([tone.values()[1]]) (nicht die Klammern). Jede Reihe hat nur einen Gegenstand. Es ergibt sich folgende csv-Ausgabe:

A,n,g,e,r 
0.068227 
0.035456 
0.043625 
0.779054 
0.054364 

Lassen Sie mich wissen, ob dies das Format ist, nach dem Sie gesucht haben.

Grundsätzlich erwartet writerow eine Liste der Werte docs.

Sie können die Verwendung von with Blöcken in Betracht ziehen, anstatt die Dateien manuell zu öffnen und zu schließen. Sie können auch mehrere Dateien in dem gleichen Block öffnen:

with open('oobar.json', "rb") as infile, open("watsf.csv","wb") as outfile: 
    json_s=infile.read() 

    writer=csv.writer(outfile) 

Es ist eine bewährte Methode, da Sie die Dateien nicht öffnen versehentlich verlassen zu riskieren.

+0

Ich entschuldige mich, dass ich nicht klar bin. Das Ziel ist es, die 5 verschiedenen Emotionen als Spaltennamen und entsprechende Werte in jeder Zeile zu erhalten. Ich habe ein Bild in der Frage als Referenz hinzugefügt. –

Verwandte Themen