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

2024-04-29 14:36:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我在file.csv中有这个输入

"","min","max","rainfall","days_clear"
"Missouri",-2,10,300,23
"Amsterdam",-3,5,1212,34
"LA",10,20,1000,54

我想写一个简单的程序来寻找降雨量最低的城市,在这个例子中是密苏里州。如何使用Python csv reader做到这一点?

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

请告知。谢谢。


Tags: csv项目程序mindayslamaxreader
3条回答
import StringIO
import csv

example = """"","min","max","rainfall","days_clear"
"Missouri",-2,10,300,23
"Amsterdam",-3,5,1212,34
"LA",10,20,1000,54
"""

data_in = StringIO.StringIO(example)
#data_in = open('mycsvdata.csv')

def read_data(data_in):
  reader = csv.reader(data_in)
  cols = []
  results = {}
  for row in reader:
    if not cols:
      cols = row
      continue
    row = [ int(x) if x.lstrip('-').isdigit() else x for x in row ]
    results[row[0]] = dict(zip(cols[1:],row[1:]))
  return results

data = read_data(data_in)

min(data.items(),key=lambda x: x[1].get('rainfall'))

回报

('Missouri', {'max': 10, 'days_clear': 23, 'rainfall': 300, 'min': -2})
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')

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

相关问题 更多 >