我正在尝试在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
答案 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内容的实际外观。