【发布时间】:2014-11-18 11:45:05
【问题描述】:
目前我的流程如下:
- 构建并向 API 发送请求
- 接收响应
- 解析 JSON 响应
- 将解析后的值写入 csv
我收到了来自 Google Directions API 的 JSON 响应。我的代码在 99% 的情况下都能正常工作,但如果我没有按预期收到 JSON 数组,则会失败。由于我在此循环之后将响应批量写入 csv,因此如果发生错误,我会丢失所有结果。
代码如下:
import requests
import csv
import json
import urlparse
import hashlib
import base64
import hmac
import sys
import time
from pprint import pprint
url_raw = 'https://maps.googleapis.com/maps/api/directions/json'
Private_Key = ''
client = ''
decodedkey = base64.urlsafe_b64decode(Private_Key)
with open('./Origins.csv', 'rU') as csvfile:
reader = csv.DictReader(csvfile)
origincoords = ['{Y},{X}'.format(**row) for row in reader]
with open('./Destinations.csv', 'rU') as csvfile:
reader = csv.DictReader(csvfile)
destinationcoords = ['{Y},{X}'.format(**row) for row in reader]
results=[]
session = requests.session()
for origin, destination in zip(origincoords, destinationcoords):
params ={'origin': origin, 'destination': destination, 'client': client}
request = requests.Request('GET', url_raw, params=params).prepare()
parsed_url = urlparse.urlparse(request.url)
Signature = hmac.new(decodedkey, '{}?{}'.format(parsed_url.path, parsed_url.query), hashlib.sha1).digest()
request.prepare_url(request.url, {'signature': base64.urlsafe_b64encode(Signature)})
response = session.send(request)
directions = response.json()
time.sleep(0.0)
results.append(directions)
pprint(results)
output = open('duration_distance_results.csv', 'w+')
writer = csv.DictWriter(output, delimiter=',', fieldnames=['duration(s)', 'distance(m)'])
writer.writeheader()
for route in results:
for leg in route['routes'][0]['legs']:
params = {
"duration(s)": leg['duration']['value'],
"distance(m)": leg['distance']['value'],
}
print(params)
writer.writerow(params)
如果我没有在预期的数组中得到 JSON 响应,我会得到一个列表索引超出范围错误,并且通过这个松散的内容到目前为止已经完成了。
理想情况下,我认为如果我在循环中写入 csv 会更健壮,因为收到每个结果,而不是在收到所有结果后才这样做。或者,正如我所尝试的,使用 if 语句 -
-
我尝试了一个 if 语句,如果存在值,则写入该值,如果不存在,则写入错误。但是,我收到以下错误“NameError: name 'leg' is not defined”
如果路线中的腿['routes'][0]['legs'] == 值: 对于结果中的路线: 对于路线中的腿['路线'] [0] ['腿']: 参数 = { “持续时间”:腿['持续时间']['价值'], “距离(米)”:腿['距离']['值'], } 打印(参数) writer.writerow(params)
其他: 结果中的价值: 错误 = { “持续时间”:“错误”, “距离(米)”:'错误', } 打印(错误) writer.writerow(错误)
-
我尝试了一个 if 语句来查看从 Google 返回的状态消息。但是,这会失败并出现错误“for error_message in results['results'][0]['error_message']: TypeError: 列表索引必须是整数,而不是 str"
对于结果中的 error_message['results'][0]['error_message']: 参数 = { "error_message": error_message}
if error_message == value: for route in results: for leg in route['routes'][0]['legs']: params = { "duration(s)": leg['duration']['value'], "distance(m)": leg['distance']['value'], } print(params) writer.writerow(params) else: for value in results: error = { "duration(s)": 'error', "distance(m)": 'error', } print(error) writer.writerow(error)pprint(结果)
很明显,我在这里学习缓慢。对处理错误的最佳方法的评论将不胜感激。
【问题讨论】: