首页 > 解决方案 > 通过 Python 抛出异常从非结构化数据中挖掘细节--> IndexError: list index out of range

问题描述

我有一个名为“数据”的 csv 文件,在第一列(列名 = 地址)中有两个地址:

1.United Kingdom, London, Burlington Gardens, 3
2.United States, Menlo Park, Sand Hill Road, 3000

我正在尝试按照代码返回country, postal_code, city, street_and_no. 使用谷歌地理编码 API 在 csv 文件中。(由于安全原因,未提及完整的 API 密钥)

import requests
import json
import csv
from tqdm import *

def addresses_from_csv(path=None, column=None):

    addresses = []

    with open(path, 'r') as f:
        reader = csv.reader(f)
        for row in reader:
            addresses.append(row[column])

    return addresses

# Get addresses from CSV
addresses = addresses_from_csv(path='C:/Users/kumarso/Documents/BioquellSales/Data.csv', column=0)

# Set Google Maps API key
api_key = 'AIzaSyCm5u6gF2QCccsn'

# Initialize array for transformed addresses
transformed = []
transformed.append(['Country', 'Post code', 'City', 'Street & No'])

for query in tqdm(addresses):

    # API call, storing information as JSON
    url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + query + '&lang=en&key=' + api_key
    r = requests.get(url)
    data = r.json()
    #print(data)

    # clear all values to avoid appending values from previous iterations a second time
    number = street = country = postal_code = city = '' 

    # looping over address components in JSON
    for component in data['results'][0]['address_components']:
        if 'street_number' in component['types']:
            number = component['long_name']
        elif 'route' in component['types']:
            street = component['long_name']
        elif 'country' in component['types']:
            country = component['long_name']
        elif 'postal_code' in component['types']:
            postal_code = component['long_name']
        elif 'locality' in component['types']:
            city = component['long_name']
        elif 'postal_town' in component['types']:
            city = component['long_name']
        else:
            continue

    street_and_no = street + ' ' + number
    transformed.append([country, postal_code, city, street_and_no])

with open('transformed_addresses.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    for row in transformed:
        writer.writerow(row)

print('done')

我收到以下错误:

“文件“c:/ExcelP/Practice.py”,第 39 行,用于数据中的组件 ['results'][0]['address_components']:IndexError:列表索引超出范围“

任何帮助将不胜感激。

补充: - 在循环地址之前打印结果

{'results': [{'address_components': [{'long_name': 'Munich', 'short_name': 'Munich', 'types': ['locality', 'political']}, {'long_name': 'Upper Bavaria', 'short_name': 'Upper Bavaria', 'types': ['administrative_area_level_2', 'political']}, {'long_name': 'Bavaria', 'short_name': 'BY', 'types': ['administrative_area_level_1', 'political']}, {'long_name': 'Germany', 'short_name': 'DE', 'types': ['country', 'political']}], 'formatted_address': 'Munich, Germany', 'geometry': {'bounds': {'northeast': {'lat': 48.2482197, 'lng': 11.7228755}, 'southwest': {'lat': 48.0616018, 'lng': 11.360796}}, 'location': {'lat': 48.1351253, 'lng': 11.5819805}, 'location_type': 'APPROXIMATE', 'viewport': {'northeast': {'lat': 48.2482197, 'lng': 11.7228755}, 'southwest': {'lat': 48.0616018, 'lng': 11.360796}}}, 'place_id': 'ChIJ2V-Mo_l1nkcRfZixfUq4DAE', 'types': ['locality', 'political']}], 'status': 'OK'}

标签: pythonpython-3.xcsvgoogle-api

解决方案


问题已解决。感谢 Massifox 提供提示。必须采取以下措施

1) 确保 CSV 中的数据没有 ASCII 字符。在控制台中打印数据以检查来自 csv 的提要是否正确。

2) 确保 API 密钥处于活动状态。

3) 在输出的 csv 文件中添加路径。例如,在我的问题中,我输入了“transformed_addresses.csv”,但这应该是完整路径。

希望有帮助!


推荐阅读