我的json文件片段如下。有没有办法使用Python并将其转换为一个漂亮的CSV文件?那么像文本和情感这样的东西会有自己的专栏吗?
{
"status":"OK",
"totalTransactions":"1",
"language":"english",
"url":"http://well.com",
"results":[
{
"text":"food",
"sentiment":{
"score":"0.456369",
"type":"positive"
}
}
]
}{
"status":"OK",
"totalTransactions":"1",
"language":"english",
"warningMessage":"truncated-oversized-text-content",
"url":"http://www.times.com",
"results":[
{
"text":"food",
"sentiment":{
"score":"0.678684",
"type":"positive"
}
}
]
}
如果不是,我想从中提取具体信息。我已尝试过此代码,但一直收到以下错误。我怀疑它与json的括号/格式有关?我该如何解决这个问题?
import json
from pprint import pprint
with open('data.json') as data_file:
data = json.load(data_file)
pprint(data)
ValueError: Extra data: line 15 column 2 - line 30 column 2 (char 367 - 780)
答案 0 :(得分:2)
JSON确实无效,请注意第15行:}{
您正在结束第一个/外部对象并开始一个新对象,基本上连接2个不同的JSON字符串。
要解决此问题,您可以使用方括号将它们包围,并在两个对象之间添加逗号,从而创建一个数组:
[{
"status":"OK",
"totalTransactions":"1",
"language":"english",
"url":"http://well.com",
"results":[
{
"text":"food",
"sentiment":{
"score":"0.456369",
"type":"positive"
}
}
]
},{
"status":"OK",
"totalTransactions":"1",
"language":"english",
"warningMessage":"truncated-oversized-text-content",
"url":"http://www.times.com",
"results":[
{
"text":"food",
"sentiment":{
"score":"0.678684",
"type":"positive"
}
}
]
}]
然后你可以遍历这个数组:
import json
from pprint import pprint
with open('data.json') as data_file:
data = json.load(data_file)
for entry in data:
print "%s;%s" % (entry['url'], entry['status'])
答案 1 :(得分:0)
正如chrki指出的那样修正了CSV,完整的python源将是:
#!/usr/bin/python
import json
with open('data.json') as data_file:
data = json.load(data_file)
out = open('out.csv', 'w+')
out.write("url;totalTransactions;language;status;text;score;type\n")
for entry in data:
out.write("%s;%s;%s;%s;%s;%s;%s\n" % (
entry['url'],
entry['totalTransactions'],
entry['language'],
entry['status'],
entry['results'][0]['text'],
entry['results'][0]['sentiment']['score'],
entry['results'][0]['sentiment']['type'])
)
答案 2 :(得分:0)
你正在将json加载到python词典中。 考虑使用python csv模块编写csv输出文件。
https://docs.python.org/2/library/csv.html
键将成为标题行,然后对于每个项目,您可以创建一行并将其输入到该行中。
答案 3 :(得分:0)
这是对问题第一部分的回答,解决了格式不正确的JSON文件问题。它试图将文件中的内容转换为对象列表(字典)并将结果命名为data
:
import json
import tempfile
# Fix the invalid json data and load it.
with tempfile.TemporaryFile() as temp_file:
temp_file.write('[\n')
with open('json_to_csv.json', 'rb') as data_file:
for line in data_file:
temp_file.write(line.replace('}{', '},{'))
temp_file.write(']\n')
temp_file.seek(0) # rewind
data = json.load(temp_file)
print(json.dumps(data, indent=4)) # show result