从 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 文件读取的每一行数据中提取所需的列,然后使用for
loop 对其进行迭代。
这种方法的一个好处是,如果需要,它可以很容易地扩展为从每行中提取多个列。它的内存效率也相当高,因为它一次迭代地处理文件中的一行。
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/except
block 留在外面,因为无论如何这都会自动发生,而且它会打印一些非常有用的东西,称为 traceback将准确显示问题发生的位置。
【讨论】:
谢谢马丁!您能帮我理解 (row[argnum] for row in data) 中的 item 语句是如何工作的吗?我对python有点陌生,我把我的代码零零碎碎地放在一起。 user3210476:当然...请参阅更新的答案。如果您认为值得,请考虑对我的回答进行投票。 再次感谢!我懒得更改异常处理,所以我就这样离开了:P 对不起,但我还没有足够的代表来投票;(以上是关于从 CSV 读取用户指定的列的主要内容,如果未能解决你的问题,请参考以下文章
当日期和时间在不同的列中时,将数据从 csv 读取到 pandas
如何在streamlit中从用户读取csv文件并转换为pandas数据框