我正在尝试从Watson API中保存JSON响应以进行音调分析。
我只想将tone_name的值保存为每行数据的标题和得分值。
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()
我希望得到像这样的csv
Watson API的响应就像这样
[
{
"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"
}
]
}
}
]
修改
writer.writerow
抛出Error: sequence expected
错误。
答案 0 :(得分:0)
您提供的JSON中存在错误(缺少大括号)。
所以我能够修复你的代码,虽然我不确定这是否是你期望的解决方案。
添加writer.writerow([tone.values()[1]])
代替writer.writerow([tone.values()[1]])
(不是括号)。每行只有一个项目。它导致以下csv输出:
A,n,g,e,r
0.068227
0.035456
0.043625
0.779054
0.054364
如果这是您要查找的格式,请告诉我。
基本上,writerow
需要一个值列表docs。
您可能需要考虑使用with
块而不是手动打开和关闭文件。您也可以在同一个块中打开多个文件:
with open('oobar.json', "rb") as infile, open("watsf.csv","wb") as outfile:
json_s=infile.read()
writer=csv.writer(outfile)
这是一种最佳做法,因为您不会冒错误地打开文件。