首页 > 解决方案 > 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/

谢谢。

标签: pythonpython-requests

解决方案


我无法运行代码,所以我猜。


你有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入,但您没有第二次签入,但它可以为您提供没有.datadata = ...data = ...datausers

您可以在一个地方同时检查两者

 if "users" in data:
      for user in data['users']:

          # ... code ...

顺便说一句:如果你想在循环中附加到文件,那么最好在循环之前附加标题。我当前的版本是在每行数据之前添加标题。或者您可以将所有数据附加到列表中,然后在循环后一次全部写入


推荐阅读