我编写了一个小脚本,用于扫描csv文件的内容以获取一系列位置名称,然后使用Geolocation API来获取和显示Latitue和Longitude坐标。
在这里,我假设csv的第二列总是包含位置名称。变量 realname 对应para1,realname=zip(*data)
中的该列。但是现在我想让程序更加通用和健壮,并要求用户输入自定义列号来读取位置名称。如何从python中的CSV读取用户指定列中的数据?
import csv
import urllib
import xml.etree.ElementTree as ET
path=raw_input("Enter source filepath: ")
# argnum=int(raw_input("Parameter column No: "))
latlist=list()
lnglist=list()
try:
with open(path,'r+') as filein:
data=csv.reader(filein, skipinitialspace = True)
para1,realname=zip(*data)
for item in realname:
urlpath="http://maps.googleapis.com/maps/api/geocode/xml?address="+ item + "&sensor=true"
xml = urllib.urlopen(urlpath)
tree = ET.parse(xml)
root = tree.getroot()
for location in root.iter('location'):
lat=location.find('lat').text
latlist.append(lat)
lng=location.find('lng').text
lnglist.append(lng)
filein.close()
print "\n\nLATS\n==========================\n"
for lats in latlist:
print lats
print "\n\nLONGS\n==========================\n"
for longs in lnglist:
print longs
except Exception,e:
print str(e)
答案 0 :(得分:0)
一种方法是使用generator expression从csv文件中读取的每行数据中提取所需的列,然后使用for
循环对其进行迭代。
这种方法的一个好处是它可以很容易地扩展,以便在需要时从每行中提取多个列。它也具有相当的内存效率,因为它一次迭代地从文件中处理一行。
import csv
import urllib
import xml.etree.ElementTree as ET
path = raw_input("Enter source filepath: ")
col = int(raw_input("Column # to extract (starting with zero): "))
latlist = []
lnglist = []
try:
with open(path, 'r+') as filein:
data = csv.reader(filein, skipinitialspace=True)
for item in (row[col] for row in data):
urlpath = (
"http://maps.googleapis.com/maps/api/geocode/xml?address=" +
item + "&sensor=true")
xml = urllib.urlopen(urlpath)
tree = ET.parse(xml)
root = tree.getroot()
for location in root.iter('location'):
lat = location.find('lat').text
latlist.append(lat)
lng = location.find('lng').text
lnglist.append(lng)
print "\n\nLATS\n==========================\n"
for lats in latlist:
print lats
print "\n\nLONGS\n==========================\n"
for longs in lnglist:
print longs
except Exception as e:
print str(e)
P.S。由于您的异常处理程序除了打印异常之外什么都不做,因此最好不要将try/except
块保留在外,因为无论如何都会自动发生这种情况,而且它会打印一些非常有用的东西,称为 traceback 它将准确显示问题发生的位置。