从 CSV 读取用户指定的列

Posted

技术标签:

【中文标题】从 CSV 读取用户指定的列【英文标题】:Reading a user specifed column from CSV 【发布时间】:2014-02-08 02:12:40 【问题描述】:

我编写了一个小脚本,它会扫描 csv 文件的内容以查找一系列位置名称,然后使用 Geolocation API 来获取和显示纬度和经度坐标。

在这里,我假设 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)

【问题讨论】:

您可以使用for item in (row[argnum] for row in data): 读取指定列,其中argnum 是(从零开始的)整数列号。 P.S.您也不需要filein.close(),因为with 语句会自动为您关闭文件。 非常感谢您的帮助。 ;) 【参考方案1】:

一种方法是使用generator expression 从从 csv 文件读取的每一行数据中提取所需的列,然后使用forloop 对其进行迭代。

这种方法的一个好处是,如果需要,它可以很容易地扩展为从每行中提取多个列。它的内存效率也相当高,因为它一次迭代地处理文件中的一行。

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)

附:由于您的异常处理程序只会打印异常,因此最好将try/exceptblock 留在外面,因为无论如何这都会自动发生,而且它会打印一些非常有用的东西,称为 traceback将准确显示问题发生的位置。

【讨论】:

谢谢马丁!您能帮我理解 (row[argnum] for row in data) 中的 item 语句是如何工作的吗?我对python有点陌生,我把我的代码零零碎碎地放在一起。 user3210476:当然...请参阅更新的答案。如果您认为值得,请考虑对我的回答进行投票。 再次感谢!我懒得更改异常处理,所以我就这样离开了:P 对不起,但我还没有足够的代表来投票;(

以上是关于从 CSV 读取用户指定的列的主要内容,如果未能解决你的问题,请参考以下文章

从 CSV 读取输入并将它们用于不同的功能

当日期和时间在不同的列中时,将数据从 csv 读取到 pandas

Python怎么读取csv文件指定列为dataframe?

如何在streamlit中从用户读取csv文件并转换为pandas数据框

python对多个csv文件里提取指定列汇总到一个新生成的csv文件

Python:从 CSV 文件中的列创建多个文本文件