从JSON文件到CSV文件

时间:2016-08-06 02:04:45

标签: python json csv

我的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)

4 个答案:

答案 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