开发者

Python IndexError: list index out of range doesn't make sense

开发者 https://www.devze.com 2023-02-20 15:47 出处:网络
I am working on a little python code which parses the response from the google maps API, however I get a \"IndexError: list index out of range\" error, which does make any sense to me. For some reques

I am working on a little python code which parses the response from the google maps API, however I get a "IndexError: list index out of range" error, which does make any sense to me. For some requests, the code is working, for some others, not.

Purpose of the code is to structure the address response to a random address and put in a dict structure for a later use.

I checked for the range of the list (e.g. counting until n-1), but it does not seem to be an issue.

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

Any suggestions and general comments to the code are highly appreciated. Thank you.

#!/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(f开发者_运维问答oo['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


Don't know if it's a mistake only in the display here, but

else:
country.append("NA")

Seems to not be in the correct indentation so it'll be executed every time regardless of the condition, and you'll have a country list longer than any other list...


Your lists are not the same size. While formattedAddress, lat and lng have the same size as result['results'], the lists country, streetnumber, streetname and city are being created in the inner loop, with one element for each s['addresscomponents']. If you check, probably there are several "NA" countries being created for each formattedAddress (one for each address element that is not a country). Therefore, if you iterate over the length of country, you will overflow formattedAddress.

This works for me:

    for s in result['results']:
        formattedAddress.append(s['formatted_address'])
        lat.append(s['geometry']['location']['lat'])
        lng.append(s['geometry']['location']['lng'])
        country.append("NA")
        streetnumber.append("NA")
        streetname.append("NA")
        city.append("NA")

        for foo in s['address_components']:
            if foo['types'][0] == "country":
                country[-1] = foo['long_name']
            if foo['types'][0] == "street_number":
                streetnumber[-1] = foo['long_name']
            if foo['types'][0] == "route":
                streetname[-1] = foo['long_name']
            if "locality" in foo['types'][0]:
                city[-1] = foo['long_name']
        data = dict()


I also noticed that this error occurred when the address at a certain point in my data was wrong. So including a "ty-except" block will help catch the IndexError (or any other errors) and allow your code to keep running.

Example:

try:
     'Your Code' 
except IndexError:
        print("Wrong Address!")
0

精彩评论

暂无评论...
验证码 换一张
取 消