python - Python 的问题 - KeyError
问题描述
我正在尝试运行 Python 代码,在其中调用 API 以提取数据并上传到 CSV 文件。CSV 文件可以正常提取,但会引发错误。有人可以让我知道我在这里可能做错了什么吗?
错误信息:
代码:
import http.client
import json
import csv
import os
conn = http.client.HTTPSConnection("api.betterimpact.com")
conn1 = http.client.HTTPSConnection("api.betterimpact.com")
if os.path.exists("CSVVolunteerOutput.csv"):
os.remove("CSVVolunteerOutput.csv")
headers = {
'Authorization': 'Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
'Cookie': '; TrackingClientId=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
}
conn.request("GET", "/v1/enterprise/users/?volunteer_status=accepted&include_custom_fields=false&include_qualifications=false&page_Size=250&include_verified_volunteers_background_check_results=false", headers=headers)
res = conn.getresponse()
data = json.load(res)
conn1.request("GET", "/v1/enterprise/users/?volunteer_status=accepted&include_custom_fields=false&include_qualifications=false&page_Size=250&include_verified_volunteers_background_check_results=false&page_number=0", headers = headers)
res1 = conn1.getresponse()
data1 = json.load(res1)
if data == None or data == "" or len(data) == 0:
print("Check API Credentials..")
exit()
volunteer_status = "Accepted"
pageNum = 0
_page_count = data1['header']['page_count']
while True:
pageNum+=1
with open('CSVVolunteerOutput.csv', 'a', newline='') as file:
writer = csv.writer(file)
writer.writerow(["SyncID", "FirstName", "LastName", "Jobtitle", "Division", "BusinessUnit", "RegionArea", "WorkLocation", "Department", "WorkEmailAddressPrimary",
"PersonalEmailAddress", "PersonalMobilePhonePrimary", "WorkCountry"])
for user in data['users']:
_id = user['user_id']
_firstName = user['first_name']
_surName = user['last_name']
_emailAddress = user['email_address']
_emailAddressSec = user['secondary_email_address']
_cellPhone = user['cell_phone']
_country = user['country']
for details in user['memberships']:
_orgName = details['organization_name']
_volunteerStatus = details['volunteer_status']
if volunteer_status == _volunteerStatus:
writer.writerow([_id, _firstName, _surName, "Volunteer", "", "", "", _orgName, "", _emailAddress,
_emailAddressSec, _cellPhone, _country])
if pageNum > int(_page_count):
break
else:
conn.request("GET", "/v1/enterprise/users/?volunteer_status=accepted&include_custom_fields=false&include_qualifications=false&page_Size=250&include_verified_volunteers_background_check_results=false&page_number="+str(pageNum), headers=headers)
res = conn.getresponse()
data = json.load(res)
print("CSV file created successfully")
API 文档在这里:https ://www.betterimpact.com/volunteer-impact-help/it-api/
谢谢。
解决方案
我无法运行代码,所以我猜。
你有data = ...
两个地方:
while
循环前- 内
while
循环
像这样
# --- first `data` ---
conn.request(...)
res = conn.getresponse()
data = json.load(res)
# ... code ...
while True:
# ... code ...
for user in data['users']:
# ... code ...
if pageNum > int(_page_count):
break
else:
# --- second `data` ---
conn.request(...)
res = conn.getresponse()
data = json.load(res)
似乎您仅在第一次之后才签users
入,但您没有第二次签入,但它可以为您提供没有.data
data = ...
data = ...
data
users
您可以在一个地方同时检查两者
if "users" in data:
for user in data['users']:
# ... code ...
顺便说一句:如果你想在循环中附加到文件,那么最好在循环之前附加标题。我当前的版本是在每行数据之前添加标题。或者您可以将所有数据附加到列表中,然后在循环后一次全部写入
推荐阅读
- docker - 如何将主机 IP 地址传递给 Docker Compose 文件?
- swagger - 从 JavaDoc 生成 OpenAPI 描述
- sql - SQL:获取某个日历周的所有工作日的值
- java - Spring Application 不会在 MySQL/PostgreSQL 中创建表
- python - http://localhost:9200/_cat/indices?v 为空
- python - Python列表问题:只想获取数据并删除字段的标题
- javascript - 是否可以在 JEST 单元测试中将 event.isTrusted 设置为 true?
- java - 调用 MSSQL 存储过程时,Spring Boot Data @Transactional 不起作用
- amazon-web-services - Amazon ECS 任务,如何在 NodeJS 中获取公共 IP
- excel - 使用脚本字典后格式化文本