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
并因此导致代码崩溃 - 所以我添加了 try
和 except
来捕捉这个。
但现在看来我只是 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)
我正在尝试使用 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
并因此导致代码崩溃 - 所以我添加了 try
和 except
来捕捉这个。
但现在看来我只是 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)