我正在研究一个小的python代码来解析来自google maps API的响应,但是我得到了一个“IndexError:list index out of range”错误,这对我来说没什么意义。对于某些请求,代码正在运行,而对于其他一些请求则不行。
代码的目的是将地址响应结构化为随机地址并放入dict结构以供以后使用。
我检查了列表的范围(例如计算到n-1),但它似乎不是问题。
Exact traceback:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "geoCodeAPI.py", line 67, in getLocation
data[i] = {'formatted_address': formattedAddress[i], 'street': streetname[i], 'street_number': streetnumber[i], 'city': city[i], 'country': country[i], 'lat': lat[i], 'lng': lng[i]}
IndexError: list index out of range
对代码的任何建议和一般性评论都非常感谢。谢谢。
#!/usr/bin/python
import urllib
import json
jsonResponse = ''
def getLocation(rawAddressString):
addressString = rawAddressString.replace(" ", "+");
url = "http://maps.googleapis.com/maps/api/geocode/json?address=" + addressString+ "&sensor=false";
googleResponse = urllib.urlopen(url);
result = json.load(googleResponse)
formattedAddress = []
lat = []
lng = []
country = []
streetnumber = []
streetname = []
city = []
for s in result['results']:
formattedAddress.append(s['formatted_address'])
lat.append(s['geometry']['location']['lat'])
lng.append(s['geometry']['location']['lng'])
for foo in s['address_components']:
if foo['types'][0] == "country":
country.append(foo['long_name'])
else:
country.append("NA")
if foo['types'][0] == "street_number":
streetnumber.append(foo['long_name'])
else:
streetnumber.append("NA")
if foo['types'][0] == "route":
streetname.append(foo['long_name'])
else:
streetname.append("NA")
if "locality" in foo['types'][0]:
city.append(foo['long_name'])
else:
city.append("NA")
data = dict()
print range(len(country))
print range(len(city))
for i in (range(len(country))):
data[i] = {'formatted_address': formattedAddress[i], 'street': streetname[i], 'street_number': streetnumber[i], 'city': city[i], 'country': country[i], 'lat': lat[i], 'lng': lng[i]}
return data
答案 0 :(得分:0)
您的列表大小不同。虽然formattedAddress, lat
和lng
的大小与result['results']
相同,但内部循环中会创建列表country, streetnumber, streetname
和city
,每个{一个元素{ {1}}。如果您检查,可能会为每个s['addresscomponents']
创建多个"NA"
个国家/地区(每个地址元素对应一个非国家/地区)。因此,如果您遍历formattedAddress
的长度,则会溢出country
。
这对我有用:
formattedAddress
答案 1 :(得分:0)
不知道这里的显示是否只是错误,但是
else:
country.append("NA")
似乎没有正确的缩进,因此无论条件如何,每次都会执行,并且您的国家/地区列表会比其他任何列表都长...
答案 2 :(得分:0)
我还注意到,当数据中某个位置的地址错误时,就会发生此错误。因此,包含“ ty-except”块将有助于捕获IndexError(或任何其他错误)并允许您的代码继续运行。
示例:
try:
'Your Code'
except IndexError:
print("Wrong Address!")