Python 从 API 返回数据时尝试排除逻辑

Python try and except logic when returning data from an API

我正在尝试使用 API 将数据存储到 CSV 文件中。

我正在使用以下方法查询 API/加载数据:

def load_data(id):
    with urlopen('url' + str(id)) as response:
        source = response.read()
        data = json.loads(source)
        return data

正在重新调整如下的字典:

{'name': 'Blah',
'address_1':'Street', 
 'address_2':'Town', 
 'website':'www.blah.com'}

然后我尝试遍历目标 ID 号列表以检索数据,如下所示:

for x in targets:
    data = load_data(x)

    try:
        data = load_data(x)

        name = data['name']
        address_1 = data['postalAddressLine1']
        address_2 = data['postalAddressLine2']
        website = data['website']

    except KeyError as e:
        pass

    with open('test.csv', 'w', newline='') as csvfile:

        # Declaring the writer 
        data_writer = csv.writer(csvfile, quoting=csv.QUOTE_ALL)

        # Writing the headers 
        data_writer.writerow(['name', 'address_1', 'address_2', 'website'])


        # Writing the data 

        data_writer.writerow([name, address_1, address_2, website])

我遇到的问题是某些迭代中缺少数据点,例如在循环 2 上没有网站,这导致 KeyError 并因此导致代码崩溃 - 所以我添加了 tryexcept 来捕捉这个。

但现在看来我只是 returning 具有上述所有数据点的 id 的数据。

我想做的是 return 所有可能的数据和 ignore/fill 的空白值 KeyError 所以我想知道我的逻辑设置是否正确,我怎样才能实现上述目标?

如果措辞不当,请告诉我!

编辑 我的代码没有写入每一行数据,因为我让编写器处于循环的错误部分。使用写入结构和 Roland Smith 的答案更新了代码以处理缺失值。

empty_value = 'TBC'
with open('test.csv', 'w', newline='') as csvfile:

    # Declaring the writer 
    data_writer = csv.writer(csvfile, quoting=csv.QUOTE_ALL)

    # Writing the headers 
    data_writer.writerow(['name', 'address_1', 'address_2', 'website'])

    for x in targets:
        data = load_data(x)

        try:
            name = data.get('name', empty_value)
            address_1 = data.get('postalAddressLine1', empty_value)
            address_2 = data.get('postalAddressLine2', empty_value)
            website = data.get('website', empty_value)

            # Writing the data 

            data_writer.writerow([name, address_1, address_2, website])

        except KeyError as e:
            print(e)
            pass

我建议手动添加缺少的键:

required = ('name', 'address_1', 'address_2', 'website')

data = load_data(x)

for key in required:
    if key not in data:
        data[key] = 'not available'

现在你的 data 至少包含了你期望的所有键。

或者,您可以使用 get 方法的 default 参数:

    ds = 'not available'
    name = data.get('name', default=ds)
    address_1 = data.get('address_1', default=ds)
    address_2 = data.get('address_2', default=ds)
    website = data.get('website', default=ds)