IndexError: 使用不同总行数的输入文件时列表索引超出范围

0 投票
1 回答
540 浏览
提问于 2025-04-20 02:52

我在运行一个脚本来处理一些地址的地理编码。用一个包含12行的输入文件时,一切正常。但是当我用另一个格式相同的输入文件(有25行)时,就出现了错误,生成的输出文件只包含12行:

Traceback (most recent call last):
  File "C:\python_scripts\geocoder_new\geocoder\example_input_and_output\geocoder.py", line 19, in     <module>
    r = geocode(line)
  File "C:\python_scripts\geocoder_new\geocoder\example_input_and_output\geocoder.py", line 8, in     geocode
    info = json.loads(data).get("results")[0].get("geometry").get("location")
IndexError: list index out of range

下面是代码:

import urllib, json
import csv

def geocode(addr):
    url = "http://maps.googleapis.com/maps/api/geocode/json?address=%s&sensor=false" %        (urllib.quote(addr.replace(' ', '+')))
    data = urllib.urlopen(url).read()
    if json.loads(data).get("status") != 'ZERO_RESULTS':
        info = json.loads(data).get("results")[0].get("geometry").get("location")
    else:
        info = {'lat': 'NIL', 'lng': 'NIL'}

    return info

fout = open('input2_25.csv', 'w')
fout.write('ADDRESS\tGPS\n')

with open('input2_25', 'r') as f:
    for line in f:
        r = geocode(line)    
        gps = ('%s, %s' % (r['lat'], r['lng']))
        add = line.strip()
        fout.write('\t'.join([line[:-1], gps]))
        fout.write('\n')

fout.close()

12行的输入文件:

Kg Sg Nibong,Lubuk,Semerah,Parit Sulong,Batu Pahat,Johor
Kg Parit Bentong,Spg Kiri,Sri Medan,Parit Sulong,Batu Pahat,Johor
Ldg B-1, Yong Peng,Tg Semberong,Yong Peng,Ayer Hitam,Batu Pahat,Johor
Kg Sri Belahan,Sg Kluang,Rengit,Batu Pahat,Batu Pahat,Johor
Parit Besar,Bagan,Semerah,Parit Sulong,Batu Pahat,Johor
Spg Tiga Bagan,Bagan,Semerah,Parit Sulong,Batu Pahat,Johor
Parit Besar,Bagan,Semerah,Parit Sulong,Batu Pahat,Johor
Parit Selulon,Linau,Parit Yaani,Sri Gading,Batu Pahat,Johor
Parit Khalil,Sri Gading,Semarang,Ayer Hitam,Batu Pahat,Johor
Kg Parit Dalam,Sri Medan,Sri Medan,Parit Sulong,Batu Pahat,Johor
Kg Parit Jatuh,Tg Semberong,Yong Peng,Ayer Hitam,Batu Pahat,Johor
Parit Besar,Bagan,Semerah,Parit Sulong,Batu Pahat,Johor

25行的输入文件:

LOT PT NO.1769, KAWASAN MIEL, PEDAS HALAL PARK,REMBAU,NEGERI SEMBILAN,
KM 13, KAMPUNG BUKIT TEMBAKAU, UMBAI, 77300 MERLIMAU, MELAKA,JASIN,MELAKA,
RUMAH SEMBELIH SHAH ALAM, JALAN UTAS 15/7, 40630 SHAH ALAM, SELANGOR DARUL     EHSAN.,PETALING,SELANGOR
14 JALAN 3 HOUSING TRUST 30250 IPOH PERAK,GOMBAK,SELANGOR
LOT PT NO.1769, KAWASAN MIEL, PEDAS HALAL PARK,REMBAU,NEGERI SEMBILAN,
RUMAH SEMBELIH SHAH ALAM, JALAN UTAS 15/7, 40630 SHAH ALAM. SELANGOR DARUL     EHSAN.,PETALING,SELANGOR,
LOT PT NO 1769, KAWASAN MIEL, PEDAS HALAL PARK,REMBAU,NEGERI SEMBILAN,
5629, RUMAH MURAH, JLN KOLAM AIR, 78000 ALOR GAJAH, MELAKA,ALOR GAJAH,MELAKA,
14 JALAN 3 HOUSING TRUST 30250 IPOH PERAK,GOMBAK,SELANGOR
LOT PT NO.1769 KAWASAN MIEL, PEDAS HALAL PARK,REMBAU,NEGERI SEMBILAN,,
LOT PT NO 1769 KAWASAN MIEL PEDAS HALAL PARK,REMBAU,NEGERI SEMBILAN
RUMAH SEMBELIH SHAH ALAM, JALAN UTAS 15/7, 40630 SHAH ALAM, SELANGOR DARUL     EHSAN.,PETALING,SELANGOR
LOT PT NO.1769, KAWASAN MIEL, PEDAS HALAL PARK,REMBAU,NEGERI SEMBILAN,
89 tanjong keramat kuala selangor selangor,HULU SELANGOR,SELANGOR
LOT PT NO.1769 KAWASAN MIEL, PEDAS HALAL PARK,REMBAU,NEGERI SEMBILAN,,
PT 11883, DESA CEMPAKA 6/2G, BANDAR BARU NILAI, NEGERI SEMBILAN.,GOMBAK,SELANGOR
LOT 9, KAMPUNG BUKIT MARAK BANGGU, 16150 KOTA BHARU, KELANTAN,KOTA BHARU,KELANTAN
NO.20, JALAN 4/4, PETALING JAYA, SELANGOR,GOMBAK,SELANGOR
33, MAIN ROAD, 43900 SEPANG, SELANGAR. ,HULU SELANGOR,SELANGOR
NO.20, JALAN 4/4, PETALING JAYA, SELANGOR,GOMBAK,SELANGOR
RUMAH SEMBELIH SHAH ALAM, JALAN UTAS 15/7, 40630 SHAH ALAM, SELANGOR DARUL     EHSAN.,PETALING,SELANGOR
302-D, TMN BUKIT BARU, BUKIT BERUANG, 75450 MELAKA,MELAKA TENGAH,MELAKA
H.KUAN ENT. KUALA PILAH,NEGERI SEMBILAN,KUALA PILAH,NEGERI SEMBILAN,,
H.KUAN ENT JLN CHANGKAT JERING BT 8,SEGARI PERAK,MANJUNG,PERAK,,
29 LOT 3229 TAMAN BONDA PAYA JARAS DALAM SUNGAI BULOH SELANGOR,PETALING,SELANGOR

12行文件的输出:

ADDRESS GPS
Kg Sg Nibong,Lubuk,Semerah,Parit Sulong,Batu Pahat,Johor    NIL, NIL
Kg Parit Bentong,Spg Kiri,Sri Medan,Parit Sulong,Batu Pahat,Johor   NIL, NIL
Ldg B-1, Yong Peng,Tg Semberong,Yong Peng,Ayer Hitam,Batu Pahat,Johor   NIL, NIL
Kg Sri Belahan,Sg Kluang,Rengit,Batu Pahat,Batu Pahat,Johor NIL, NIL
Parit Besar,Bagan,Semerah,Parit Sulong,Batu Pahat,Johor NIL, NIL
Spg Tiga Bagan,Bagan,Semerah,Parit Sulong,Batu Pahat,Johor  NIL, NIL
Parit Besar,Bagan,Semerah,Parit Sulong,Batu Pahat,Johor NIL, NIL
Parit Selulon,Linau,Parit Yaani,Sri Gading,Batu Pahat,Johor NIL, NIL
Parit Khalil,Sri Gading,Semarang,Ayer Hitam,Batu Pahat,Johor    NIL, NIL
Kg Parit Dalam,Sri Medan,Sri Medan,Parit Sulong,Batu Pahat,Johor    NIL, NIL
Kg Parit Jatuh,Tg Semberong,Yong Peng,Ayer Hitam,Batu Pahat,Johor   NIL, NIL
Parit Besar,Bagan,Semerah,Parit Sulong,Batu Pahat,Johor NIL, NIL

25行文件的输出是一个空的csv文件。

我总共有7000个地址需要进行地理编码,所以把地址分成每个文件12个地址会非常麻烦。

任何帮助都将非常感激。谢谢!

1 个回答

0

这句话的意思是,json.loads(data).get("results") 这个地方在索引 0 位置没有找到任何内容,也就是说它是空的。

你可以试着用出错那一行的变量去请求一下 API 的网址。很可能是谷歌找不到那个地址的坐标。

你可以把结果列表放到一个变量里,然后检查一下它是否为空:

可以这样做:

results = json.loads(data).get("results")
if results:
    info = results[0].get("geometry").get("location")
else:
    print "no results"

撰写回答