【问题标题】:JSON query in a post request from Python and save result as csv file来自 Python 的 post 请求中的 JSON 查询并将结果保存为 csv 文件
【发布时间】:2014-08-12 14:19:47
【问题描述】:

我正在尝试编写一个连接到指定 url 的程序:

http://api.scb.se/OV0104/v1/doris/sv/ssd/START/BO/BO0104/BostadsbestandK

并使用此查询:

{ "query": [ { "code": "Region", "selection": { "filter": "vs:RegionRiket99", "values": [ "00" ] } }, { "code": "Hustyp", "selection": { "filter": "item", "values": [ "FLERBO", "SMÅHUS" ] } }, { "code": "Tid", "selection": { "filter": "item", "values": [ "2012" ] } } ], "response": { "format": "csv" } }

然后我想将结果存储到 csv 文件中。

这是我目前的代码:

import urllib.request
import json

url = 'http://api.scb.se/OV0104/v1/doris/sv/ssd/START/BO/BO0104/BostadsbestandK'

data = '{ "query": [ { "code": "Region", "selection": { "filter": "vs:RegionRiket99", "values": [ "00" ] } }, { "code": "Hustyp", "selection": { "filter": "item", "values": [ "FLERBO", "SMÅHUS" ] } }, { "code": "Tid", "selection": { "filter": "item", "values": [ "2012" ] } } ], "response": { "format": "csv" } }'
data = json.dumps(data)

【问题讨论】:

  • 不,我不知道如何使用“原始”json 查询,即它是由 API 所有者定义的。

标签: python json csv post python-3.x


【解决方案1】:

您应该将查询定义为字符串;将其保留为 Python 对象:

data = { "query": [ { "code": "Region", "selection": { "filter": "vs:RegionRiket99", "values": [ "00" ] } }, { "code": "Hustyp", "selection": { "filter": "item", "values": [ "FLERBO", "SMÅHUS" ] } }, { "code": "Tid", "selection": { "filter": "item", "values": [ "2012" ] } } ], "response": { "format": "csv" } }
data = json.dumps(data)

您需要设置一个application/json 请求标头来指示内容是什么。您可以使用urllib.request.Request() 对象来执行此操作;首先将 JSON 数据编码为 UTF-8:

request = urllib.request.Request(url, data.encode('utf8'))
request.add_header('content-type', 'application/json')
response = urllib.request.urlopen(request)

现在您可以将 CSV 保存到文件中;使用shutil.copyfileobj() 会提高效率,即使对于大型响应:

import shutil

with open(csvfilename, 'wb') as outf:
    shutil.copyfileobj(response, outf)

【讨论】:

  • 我收到此错误消息: Traceback(最近一次调用最后一次):文件“C:\Lagring\Python\PostRequest 1.py”,第 17 行,在 shutil.copyfileobject(response, outf) AttributeError: 'module' 对象没有属性 'copyfileobject'
  • @user3933746:很抱歉,这是我的错别字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 2014-02-20
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
相关资源
最近更新 更多