如何使用Python提取CSV中的行和列

4 投票
5 回答
18556 浏览
提问于 2025-04-16 15:29

我有一个文件叫做 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 个回答

0

要从文件中读取数据,你需要去掉所有处理字符串的代码:

   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上;不要放在评论里!!

1

一种方法是使用 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')
6
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')

返回

撰写回答