将特定的键值对从JSON响应写入CSV

时间:2018-10-26 23:00:16

标签: python json api

我正在尝试在Python中构建IPStack API脚本。我在将JSON输出写入CSV时遇到问题。 (此脚本的下一个阶段将通过发送多个ip_address值,因此我需要反复进行此操作。)

我一直想弄清楚如何告诉Python将哪些键值对写入CSV。下面是我的代码,后面是它发回的错误。

非常感谢您提供任何见识。

import requests
import csv
import json

ip_address = '65.222.2.114'

# key = '?access_key=12345'

full_request = 'http://api.ipstack.com/' + ip_address + '?access_key=12345'

joined_full_request = ''.join(full_request)

r = requests.get(joined_full_request)

output = r.json()

print(output)

with open('/Users/reallymemorable/Desktop/iptest.csv', 'w', newline='') as csvfile:
    fieldnames = ['continent_name', 'country_code', 'country_name', 'region_code', 'region_name', 'city', 'zip', 'latitude', 'longitude']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writerow({['continent_name'], ['country_code'], ['country_name'], ['region_code'], ['region_name'], ['city'], ['zip'], ['latitude'], ['longitude']})

错误:

TypeError: unhashable type: 'list'

此外,当我编辑writer.writerow行以执行此操作时,例如“ output ['continent_name']”,它给了我这个错误:

TypeError: writerow() takes 2 positional arguments but 10 were given

1 个答案:

答案 0 :(得分:3)

在这一行:

writer.writerow({['continent_name'], ['country_code'], ['country_name'], ['region_code'], ['region_name'], ['city'], ['zip'], ['latitude'], ['longitude']})

您使用{(这是用于字典({k1: v1, k2: v2, ...})的开头来打开的,但是您尝试在两个大括号内填充一个列表。那没有任何意义,并且会出现错误,因为您正在尝试使用Python将列表用作字典键。

您已经创建了一个DictWriter实例,这意味着您需要将 dictionaries 传递给writerow方法。因此,例如:

writer.writerow({'continent_name': 'north america',
                 'country_code': '1',
                 'country_name': 'united states',
                 'region_code': 'foo',
                 'region_name': 'bar',
                 'city': 'boston',
                 'zip': '02110',
                 'latitude': 42,
                 'longitude': -72})

如果您尝试从JSON结果写入值,则只需提取必要的一个或多个键即可。如果您在这方面需要更多帮助,则需要更新问题以显示JSON内容的实际外观。