在Python中从CSV读取用户特定列

时间:2014-01-18 18:25:10

标签: python list csv zip

我编写了一个小脚本,用于扫描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)

1 个答案:

答案 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 它将准确显示问题发生的位置。