You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Maps Geocoding API批量解析CSV地址异常:仅返少量坐标且报索引越界

搞定批量地址解析的问题!

我帮你分析下为啥处理200条CSV时会出问题,再给你修复好的代码:

先说说你代码里的坑

  • 地址格式错了:你直接把row(CSV读出来的是列表)转成字符串,比如一行地址是["北京市朝阳区"],转成str后会变成"['北京市朝阳区']",Google API根本认不出这种格式,返回的results是空数组,你硬去取d['results'][0]当然会索引越界!
  • 没处理API的各种异常情况:Google Geocoding API有请求配额限制,免费版每天有上限,短时间批量请求还会被限流;而且有些地址本身就解析不了,API会返回ZERO_RESULTS,这时候results也是空的。
  • 异常捕获太敷衍:你直接except: pass,所有错误都被掩盖了,连哪里错了都不知道,怎么修?
  • 可能没跳过CSV表头:如果你的CSV第一行是“地址”这种表头,直接循环会把表头也当成地址去请求,肯定失败。

修复后的完整代码

import requests
import json
import csv
import time

apiKey = "你的API密钥"

with open('address.csv', 'r', encoding='utf-8') as csvDataFile:
    csvReader = csv.reader(csvDataFile)
    # 跳过表头(如果你的CSV没有表头,就把这行注释掉)
    next(csvReader)
    
    for line_num, row in enumerate(csvReader, start=1):
        # 先处理空行和空地址
        if not row:
            print(f"第{line_num}行是空行,跳过")
            continue
        address = row[0].strip()
        if not address:
            print(f"第{line_num}行地址为空,跳过")
            continue
        
        try:
            # 对地址做URL编码,避免中文、空格这些特殊字符搞砸请求
            encoded_addr = requests.utils.quote(address)
            api_url = f"https://maps.googleapis.com/maps/api/geocode/json?address={encoded_addr}&key={apiKey}"
            
            # 发送请求,加个超时防止卡住
            response = requests.get(api_url, timeout=10)
            response.raise_for_status()  # 捕获403、429这类HTTP错误
            
            result_data = response.json()  # 直接用response.json()更方便
            
            # 先看API返回的状态,只有OK才去拿坐标
            if result_data['status'] == 'OK':
                location = result_data['results'][0]['geometry']['location']
                print(f"✅ 第{line_num}行 | 地址: {address} | 坐标: {location}")
            else:
                error_msg = result_data.get('error_message', '无额外信息')
                print(f"❌ 第{line_num}行 | 地址: {address} | 解析失败 | 状态: {result_data['status']} | 原因: {error_msg}")
            
            # 加个延迟,避免触发API的速率限制(免费版建议每秒1次)
            time.sleep(1)
            
        except requests.exceptions.RequestException as req_err:
            print(f"⚠️ 第{line_num}行 | 请求地址{address}时出错: {str(req_err)}")
        except IndexError:
            print(f"⚠️ 第{line_num}行 | 地址{address}返回结果为空,无法获取坐标")
        except Exception as err:
            print(f"⚠️ 第{line_num}行 | 处理地址{address}时发生未知错误: {str(err)}")

几个关键优化的地方

  • 正确提取地址:取row[0]作为地址(假设CSV每行只有一个地址列),还做了去空格处理,再用requests.utils.quote()编码,保证URL是有效的。
  • 跳过无效行:自动跳过空行、空地址,还有表头(如果有的话),减少无效请求。
  • 处理API状态:不再盲目取results[0],先检查status字段,不同错误状态都给明确提示,比如限流、地址无效这些情况都能看到原因。
  • 精准捕获异常:分类型抓异常,请求错误、索引错误、未知错误都有对应的提示,方便你排查问题。
  • 添加请求延迟:Google API对请求频率有限制,加1秒延迟能避免被限流,付费版的话可以调短一点。

另外,记得去Google Cloud控制台看看你的API密钥是不是有效,还有配额够不够,要是配额用完了也会导致请求失败哦。

内容的提问来源于stack exchange,提问作者Kamran Tariq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:40:30