def read_csv(file, columns, type_name="Row"): try: row_type = namedtuple(type_name, columns) except ValueError: row_type = tuple rows = iter(csv.reader(file)) header = rows.next() mapping = [header.index(x) for x in columns] for row in rows: row = row_type(*[row[i] for i in mapping]) yield row
例子:
>>> import csv>>> from collections import namedtuple>>> from StringIO import StringIO>>> def read_csv(file, columns, type_name="Row"):... try:... row_type = namedtuple(type_name, columns)... except ValueError:... row_type = tuple... rows = iter(csv.reader(file))... header = rows.next()... mapping = [header.index(x) for x in columns]... for row in rows:... row = row_type(*[row[i] for i in mapping])... yield row... >>> testdata = """... AAA,bbb,ccc,DDD,eee,FFF,GGG,hhh... 1,2,3,4,50,3,20,4... 2,1,3,5,24,2,23,5... 4,1,3,6,34,1,22,5... 2,1,3,5,24,2,23,5... 2,1,3,5,24,2,23,5... """>>> testfile = StringIO(testdata)>>> for row in read_csv(testfile, "AAA GGG DDD".split()):... print row... Row(AAA='1', GGG='20', DDD='4')Row(AAA='2', GGG='23', DDD='5')Row(AAA='4', GGG='22', DDD='6')Row(AAA='2', GGG='23', DDD='5')Row(AAA='2', GGG='23', DDD='5')



