Read specific columns in csv using python

前端 未结 7 1479
耶瑟儿~
耶瑟儿~ 2021-02-06 06:27

I have a csv file that look like this:

+-----+-----+-----+-----+-----+-----+-----+-----+
| AAA | bbb | ccc | DDD | eee | FFF | GGG | hhh |
+-----+-----+-----+-----+---         


        
7条回答
  •  轮回少年
    2021-02-06 07:01

    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
    

    Example:

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

提交回复
热议问题