如何使用Python提取CSV中的行和列
我有一个文件叫做 file.csv,里面有一些数据。
"","min","max","rainfall","days_clear"
"Missouri",-2,10,300,23
"Amsterdam",-3,5,1212,34
"LA",10,20,1000,54
我想写一个简单的程序,找出降雨量最少的城市,在这个例子中是密苏里州。请问我该如何使用 Python 的 csv 读取器来实现呢?
我可以尝试提取这些数据,但不幸的是,文件的第一行是必须保留的。我想要的结果类似于 count[密苏里州]=300,count[阿姆斯特丹]=1212 等等,这样我就可以找出最小值,并且能回溯打印出城市的名字。
请给我一些建议。谢谢。
5 个回答
要从文件中读取数据,你需要去掉所有处理字符串的代码:
reader = csv.reader(open('file.csv', 'rb'))
rainfall = csv_extract_col(reader, 'rainfall', '')
更新:抱歉,这个过程需要更多的工作。csv_extract_col
的第一个参数会被用作csv.DictReader
的第一个参数,所以(在这个例子中)它应该是一个打开的文件对象,而不是csv.reader
的实例。请看下面的内容:
import csv
### def csv_extract_col(csvinput, colname, key):
### exactly as provided by @martineau
if __name__ == '__main__':
import sys
filename, data_col_name, key_col_name = sys.argv[1:4]
input_file_object = open(filename, 'rb')
result_dict = csv_extract_col(input_file_object, data_col_name, key_col_name)
print result_dict
print min(result_dict.iteritems(), key=lambda r: float(r[1]))
结果:
command-prompt>\python27\python joj_csv.py joj.csv rainfall ""
{'Amsterdam': '1212', 'LA': '1000', 'Missouri': '300'}
('Missouri', '300')
command-prompt>\python27\python joj_csv.py joj.csv days_clear ""
{'Amsterdam': '34', 'LA': '54', 'Missouri': '23'}
('Missouri', '23')
更新 2:针对评论“我一定漏掉了什么..我试过了.. [看起来像是@martineau的函数],用你定义的主函数。在我的命令行中,我定义了python rainfall ""。但它给我返回了KeyError: 'rainfall'”
有两种可能性:
(1) 你在拼接源代码的时候犯了错误。检查一下你的代码。
(2) 你的文件里没有预期的标题行内容。试着调试一下,比如修改@martineau的代码,插入一个打印语句等,看看csv.DictReader
对你的标题行有什么看法:
reader = csv.DictReader(csvinput)
print "fieldnames", reader.fieldnames
assert colname in reader.fieldnames
assert key in reader.fieldnames
for row in reader:
如果你还是解决不了问题,给我们看一下你所有的代码,以及完整的错误追踪信息和错误消息——要么编辑你的问题,要么把它放到pastbin或dropbox上;不要放在评论里!!
一种方法是使用 csv
模块里的 DictReader
类来写一个函数,从中提取出某一列的数据。DictReader
会自动处理第一行的字段名称,所以你不用担心这一点。然后,你可以使用内置的 min()
函数来找出这一列中值最小的项目。
import csv
def csv_extract_col(csvinput, colname, key):
""" extract a named column from a csv stream into a dictionary
colname: name of columm to extract
key: name of another columm to use as keys in returned dict
"""
col = {}
for row in csv.DictReader(csvinput):
col[row[key]] = row[colname]
return col
if __name__=='__main__':
import StringIO
csvdata = """\
"","min","max","rainfall","days_clear" # field name row
"Missouri",-2,10,300,23
"Amsterdam",-3,5,1212,34
"LA",10,20,1000,54
"""
csvfile = StringIO.StringIO(csvdata)
rainfall = csv_extract_col(csvfile, 'rainfall', '')
print rainfall
# {'Amsterdam': '1212', 'LA': '1000', 'Missouri': '300'}
print min(rainfall.iteritems(), key=lambda r: float(r[1]))
# ('Missouri', '300')
import csv
def main():
with open('file.csv', 'rb') as inf:
data = [(int(row['rainfall']), row['']) for row in csv.DictReader(inf)]
data.sort()
print data[0]
if __name__=="__main__":
main()
(300, 'Missouri')
返回