如何使用python提取csv中的列和行

如何使用python提取csv中的列和行,python,csv,Python,Csv,我将此输入保存在一个.csv文件中 "","min","max","rainfall","days_clear" "Missouri",-2,10,300,23 "Amsterdam",-3,5,1212,34 "LA",10,20,1000,54 我想写一个简单的程序来找出降雨量最低的城市,在这个例子中是密苏里州。如何使用Python csv阅读器实现这一点 我可以尝试提取项目,但不幸的是,文件的第一行必须在那里。 我想要像密苏里州计数=300这样的数字 计数[阿姆斯特丹]=1212等。。这

我将此输入保存在一个.csv文件中

"","min","max","rainfall","days_clear"
"Missouri",-2,10,300,23
"Amsterdam",-3,5,1212,34
"LA",10,20,1000,54
我想写一个简单的程序来找出降雨量最低的城市,在这个例子中是密苏里州。如何使用Python csv阅读器实现这一点

我可以尝试提取项目,但不幸的是,文件的第一行必须在那里。 我想要像密苏里州计数=300这样的数字 计数[阿姆斯特丹]=1212等。。这样我可以做一个最低限度的参考回打印城市

请告知。谢谢

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')
返回

('Missouri', {'max': 10, 'days_clear': 23, 'rainfall': 300, 'min': -2})

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

要读取文件,需要删除所有处理字符串的代码:

   reader = csv.reader(open('file.csv', 'rb'))
   rainfall = csv_extract_col(reader, 'rainfall', '')
更新:抱歉,需要做的工作比这多一些。
csv\u extract\u 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的函数]使用您定义的上述主函数。然后在我的shell中,我定义了python Rainsion”“。但它给了我keyrerror:“Rainsion”

两种可能性:

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

我的代码适用于多个城市具有相同最小值或多个城市具有相同最大值的情况:

import csv

def minmax_col(filename,key,colname):
    with open(filename,'rb') as csvfile:
        rid = csv.DictReader(csvfile,
                             fieldnames=None,
                             quoting=csv.QUOTE_NONNUMERIC)

        mini = float('inf')
        maxi = float('-inf')
        limin = limax =[]

        for row in rid:
            if row[colname] == maxi:
                limax.append(row[key])
            elif row[colname] > maxi:
                maxi = row[colname]
                limax = [row[key]]

            if row[colname] == mini:
                limin.append(row[key])
            elif row[colname] < mini:
                mini = row[colname]
                limin = [row[key]]

    return (key,(maxi,limax),(mini,limin))



key = 'rainfall'
city,(Ma,liMa),(mi,limi) = minmax_col('filename.csv','',key)
print 'Cities analysed on ' + repr(key) + ' parameter :'
print 'maximum==',Ma,'  cities :',', '.join(liMa)
print 'minimum==',mi,'  cities :',', '.join(limi)

print 

key = 'min'
city,(Ma,liMa),(mi,limi) = minmax_col('filename.csv','',key)
print 'Cities analysed on ' + repr(key) + ' parameter :'
print 'maximum==',Ma,'  cities :',', '.join(liMa)
print 'minimum==',mi,'  cities :',', '.join(limi)
结果是

Cities analysed according the 'rainfall' parameter :
maximum== 1212.0   cities : Amsterdam, Kologoro
minimum== 300.0   cities : Missouri

Cities analysed according the 'min' parameter :
maximum== 28.0   cities : Kologoro
minimum== -3.0   cities : Amsterdam

特别的问题是什么?为什么使用PythonCSV模块不可能做到这一点?到目前为止你有什么?不要期望我们重复您可以在CSV模块的Python库参考中找到的相同的CSV示例…您到底需要什么?
如果不需要cols:cols=row
-对于cleaner
CSV.DictReader
的使用,这是一个很好的解决方法。感谢所有不同的答案和建议。马提诺的后一个似乎适合我。但是,我正在考虑如何使用file.csv而不是单独在csvdata中分配数据。@joj:我只做了
csvdata
a
StringIO
来测试我的示例代码。只需使用
csvfile=open('file.csv')
即可。是的@John,我尝试删除并替换这些字符串(类似于您上面建议的字符串)。它给了我错误:-回溯(最近的调用最后一次):文件“”,第1行,在文件“gy.py”中,第28行,在rainum=csv\u extract\u col(reader,'rainum',“”)文件“gy.py”中,第10行,在csv\u extract\u col中,在csv.DictReader(csvinput)中的行:文件“/usr/lib/python2.6/csv.py”,第103行,在下一个self.fieldnames文件中“/usr/lib/python2.6/csv.py”,第90行,字段名self.\u fieldnames=self.reader.next()TypeError:应为字符串或Unicode对象,列表found@martineau,有什么建议吗?我尝试通过删除字符串文字来使用您的建议,但仍然无法对我起作用。与上面的错误相同。我一定遗漏了什么。我尝试了..导入csv def csv\u extract\u col(csvinput,colname,key):“”将csv流中的命名列提取到字典colname:name of column以提取关键字:另一个column的名称以用作csv中行的返回dict“”中的关键字。DictReader(csvinput):col[row[key]]=row[colname]使用您定义的上述主函数返回col。然后在我的shell中,我定义了python rainment“”。但它为我提供了KeyError:“rainment”
打印列表(groupby(data,key=itemgetter(0))[0])
,用于多个城市具有相同最小降雨量的情况
"","min","max","rainfall","days_clear"
"Missouri",-2,10,300,23
"Amsterdam",-3,5,1212,34
"Oslo",-2,8,800,12
"LA",10,20,1000,54
"Kologoro",28,45,1212,1
Cities analysed according the 'rainfall' parameter :
maximum== 1212.0   cities : Amsterdam, Kologoro
minimum== 300.0   cities : Missouri

Cities analysed according the 'min' parameter :
maximum== 28.0   cities : Kologoro
minimum== -3.0   cities : Amsterdam