converteer csv-bestand naar lijst met woordenboeken

Ik heb een csv-bestand

col1, col2, col3
1, 2, 3
4, 5, 6

Ik wil een lijst met woordenboeken maken op basis van deze csv.

uitvoer als:

a= [{'col1':1, 'col2':2, 'col3':3}, {'col1':4, 'col2':5, 'col3':6}]

Hoe kan ik dit doen?


Antwoord 1, autoriteit 100%

Gebruik csv.DictReader:

import csv
with open('test.csv') as f:
    a = [{k: int(v) for k, v in row.items()}
        for row in csv.DictReader(f, skipinitialspace=True)]

Zal resulteren in:

[{'col2': 2, 'col3': 3, 'col1': 1}, {'col2': 5, 'col3': 6, 'col1': 4}]

Antwoord 2, autoriteit 32%

Nog een eenvoudiger antwoord:

   import csv
    with open("configure_column_mapping_logic.csv", "r") as f:
        reader = csv.DictReader(f)
        a = list(reader)
        print a

Antwoord 3, autoriteit 9%

De module csven een lijstbegrip gebruiken:

import csv
with open('foo.csv') as f:
    reader = csv.reader(f, skipinitialspace=True)
    header = next(reader)
    a = [dict(zip(header, map(int, row))) for row in reader]
print a    

Uitvoer:

[{'col3': 3, 'col2': 2, 'col1': 1}, {'col3': 6, 'col2': 5, 'col1': 4}]

Antwoord 4, autoriteit 2%

# similar solution via namedtuple:    
import csv
from collections import namedtuple
with open('foo.csv') as f:
  fh = csv.reader(open(f, "rU"), delimiter=',', dialect=csv.excel_tab)
  headers = fh.next()
  Row = namedtuple('Row', headers)
  list_of_dicts = [Row._make(i)._asdict() for i in fh]

Antwoord 5

Nou, terwijl andere mensen het op een slimme manier deden, heb ik het naïef geïmplementeerd. Ik veronderstel dat mijn aanpak het voordeel heeft dat er geen externe modules nodig zijn, hoewel het waarschijnlijk zal mislukken met rare configuraties van waarden. Hier is het alleen ter referentie:

a = []
with open("csv.txt") as myfile:
    firstline = True
    for line in myfile:
        if firstline:
            mykeys = "".join(line.split()).split(',')
            firstline = False
        else:
            values = "".join(line.split()).split(',')
            a.append({mykeys[n]:values[n] for n in range(0,len(mykeys))})

Antwoord 6

Eenvoudige methode om CSV te ontleden in een lijst met woordenboeken

with open('/home/mitul/Desktop/OPENEBS/test.csv', 'rb') as infile:
  header = infile.readline().split(",")
  for line in infile:
    fields = line.split(",")
    entry = {}
    for i,value in enumerate(fields):
      entry[header[i].strip()] = value.strip()
      data.append(entry)

Other episodes