【问题标题】:How can I write Parsed JSON to a CSV fie?如何将 Parse JSON 写入 CSV 文件?
【发布时间】:2017-09-02 19:19:03
【问题描述】:

注意:请查看已勾选答案的 cmets 以获取解决方案:)

我正在编写一些 python 来访问 API 并将服务器的响应 (JSON) 导出到 CSV 文件。 JSON 是嵌套的。

这是来自服务器的 JSON 响应(这只是响应的示例):

{  
   "id":182774,
   "website_id":307842,
   "engine_provider":"Google",
   "engine_name":"United Kingdom",
   "keywords":[  
      {  
         "id":4464443,
         "groups_id":[  
            44424
         ],
         "name":"SMART E70 Interactive Display",
         "positions":{  
            "2017-03-16":10
         }
      },
      {  
         "id":4464442,
         "groups_id":[  
            44424
         ],
         "name":"SMART Podium SP518",
         "positions":{  
            "2017-03-16":4
         }
      },
      {  
         "id":4464441,
         "groups_id":[  
            44424
         ],
         "name":"SMART Board M680",
         "positions":{  
            "2017-03-16":3
         }
      },
      {  
         "id":4464338,
         "groups_id":[  
            51168
         ],
         "name":"NEC Lamps",
         "positions":{  
            "2017-03-16":4
         }
      }
   ]
}

如果 JSON 看起来有问题,可能是因为我在为这篇文章采样时编辑了错误。

在 Python 中,我尝试解析查询响应,然后将嵌套字段写入 CSV 表,如下所示:

parsedqueryresponse = queryresponse.json()
f = csv.writer(open(csvoutputpath, "wb+"))
f.writerow(["name", "positions", "id"])
for parsedqueryresponse in parsedqueryresponse:
    f.writerow([parsedqueryresponse["keywords"]["name"],
               parsedqueryresponse["keywords"]["positions"],
               parsedqueryresponse["keywords"]["id"]])

当我运行脚本时出现此错误:

"第 146 行,在 f.writerow([parsedqueryresponse["keywords"]["name"], TypeError: 字符串索引必须是整数"

第 146 行是这一行(也被错误消息引用):

f.writerow([parsedqueryresponse["keywords"]["name"]

我在这里做错了什么?我尝试将 JSON 字段更改为使用 ' 而不是 " 但这似乎并没有让事情变得更好......

【问题讨论】:

  • 可能'parsedqueryresponse'是一个字符串

标签: python json api csv parsing


【解决方案1】:

请试试这个,

import csv
import json

parsedqueryresponse = queryresponse.json()
f = csv.writer(open(csvoutputpath, "wb+"))
f.writerow(["name", "positions", "id"])
for entry in parsedqueryresponse["keywords"]:
    f.writerow([entry["name"],
               entry["positions"],
               entry["id"]])

输出:

name,positions,id
SMART E70 Interactive Display,{2017-03-16: 10},4464443
SMART Podium SP518,{2017-03-16: 4},4464442
SMART Board M680,{2017-03-16: 3},4464441
NEC Lamps,{2017-03-16: 4},4464338

如有任何疑问,请告诉我。

【讨论】:

  • 感谢您的帮助!现在我得到了这个:“第 142 行,在 parsedqueryresponse = json.loads(queryresponse.json()) 文件“C:\Python27\lib\json_init_.py”中,第 338 行,在加载中返回 _default_decoder.decode(s) 文件“C:\Python27\lib\json\decoder.py”,第 366 行,在 decode obj 中,end = self.raw_decode(s, idx=_w(s, 0)。 end()) TypeError: 预期的字符串或缓冲区"
  • 这意味着 'queryresponse.json()' 不是字符串。请找到'queryresponse.json()'的类型
  • 如果类型是dict那么你不需要使用json.loads()
  • 当我按照你的指示重新编写它时,它工作得很好:) "parsedqueryresponse = queryresponse.json() f = csv.writer(open(csvoutputpath, "wb+")) f.writerow (["name", "positions", "id"]) 用于 parsedqueryresponse["keywords"] 中的条目: f.writerow([entry["name"], entry["positions"], entry["id"] ])"
  • W 表示写入。 B 表示二进制。 + 表示追加。因此它将以二进制模式将输入附加到文件中。
猜你喜欢
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 2017-12-22
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
相关资源
最近更新 更多