如何将 API 数据保存为 CSV 格式?

数据挖掘 机器学习 Python 数据集 CSV json
2022-02-17 20:08:15

有没有一种简单的方法可以使用 python 命令转换 API 数据并以 CSV 格式输出结果?

这就是我现在正在做的事情:

import requests

params = {
  "api_key": "fec742c1-c846-4343-a9f1-91c729acd097",
  "format": "jsonp"
  }
r = requests.get('https://data.sa.gov.au/data/api/3/action/datastore_search')
print(r.text)

# This bit of code will write the result of the query to output.csv

with open('output.csv', 'w+') as f:
    f.write(r.text)

此代码不起作用。API 数据可在此处获得

1个回答

在您链接的页面上,实际上有一个关于如何获取数据的 Python 示例。它在 Python 2 中,但我将向您展示如何使其在 Python 3 中工作。

import urllib
import json                 # Used to load data into JSON format
from pprint import pprint   # pretty-print

url = "https://data.sa.gov.au/data/api/3/action/datastore_search?resource_id=fec742c1-c846-4343-a9f1-91c729acd097&limit=5&q=title:jones"
response = urllib.request.urlopen(url)
print(response)
# Just an object:   <http.client.HTTPResponse at 0x7f2618123e10>

我们使用以下read()方法获取文本数据:

text = response.read()

在这种情况下,响应是一个原始字符串。我们可以使用模块json函数loads加载一个字符串):

json_data = json.loads(text)

pprint(json_data)

返回以下 JSON 数据:

{'help': 'https://data.sa.gov.au/data/api/3/action/help_show?name=datastore_search',
 'result': {'_links': {'next': '/api/3/action/datastore_search?q=title%3Ajones&offset=5&limit=5&resource_id=fec742c1-c846-4343-a9f1-91c729acd097',
                       'start': '/api/3/action/datastore_search?q=title%3Ajones&limit=5&resource_id=fec742c1-c846-4343-a9f1-91c729acd097'},
            'fields': [{'id': '_id', 'type': 'int4'},
                       {'id': 'LGA Name', 'type': 'text'},
                       {'id': 'Tenure type', 'type': 'text'},
                       {'id': 'Very low income <$603 per wk', 'type': 'numeric'},
                       {'id': 'Low income $603-$964 per wk', 'type': 'numeric'},
                       {'id': 'Moderate income $965-$1446 per wk',                            'type': 'numeric'},
                       {'id': 'Total', 'type': 'numeric'},
                       {'id': '_full_count', 'type': 'int8'},
                       {'id': 'rank', 'type': 'float4'}],
            'limit': 5,
            'q': 'title:jones',
            'records': [],
            'resource_id': 'fec742c1-c846-4343-a9f1-91c729acd097'},
 'success': True}

我建议使用 Pandas,它可以非常轻松地为您完成很多繁琐的工作。它可以直接从 JSON 字符串中读取(我们text上面的)。问题是它会有点奇怪地解析它。

没有简单的方法可以直接将其写入 CSV 文件,因为存在嵌套结构:例如,在“结果”下有“字段”,然后是更多值,而 CSV 文件无法直接显示。你需要自己把结构弄平,也许决定什么是重要的,或者你想要什么可以省略。

您可以采用json_data上面格式化的 JSON 并手动解包,删除嵌套部分,这意味着查看响应并制作您自己的 Python 字典,只有单层,即没有嵌套。假设您这样做并有一个名为r. 完成后,您可以使用 Pandas 执行以下操作来编写 CSV 文件:

import pandas as pd

df = pd.read_json(r)
df.to_csv("output.csv")