2015-04-03 16 views
6

un file CSV names.csv ha un contenuto:Converti un oggetto csv.DictReader in un elenco di dizionari?

first_name last_name 
Baked Beans 
Lovely Spam 
Wonderful Spam 

vorrei leggerlo in una lista di dizionari, con la prima riga contenente le chiavi:

>>> import csv 
>>> with open('names.csv') as csvfile: 
...  reader = csv.DictReader(csvfile) 
...  for row in reader: 
...   print(row['first_name'], row['last_name']) 
... 
Baked Beans 
Lovely Spam 
Wonderful Spam 

Ma è il tipo di readercsv.DictReader ? Come posso convertire reader in un elenco di dizionari? Grazie.

risposta

6

Uso list():

print(list(reader)) 

Demo:

>>> with open('names.csv') as csvfile: 
...  reader = csv.DictReader(csvfile, delimiter=" ") 
...  print(list(reader)) 
... 
[{'first_name': 'Baked', 'last_name': 'Beans'}, {'first_name': 'Lovely', 'last_name': 'Spam'}, {'first_name': 'Wonderful', 'last_name': 'Spam'}] 
12
import csv 
with open("in.csv") as csvfile: 
    reader = csv.DictReader(csvfile,delimiter=" ") 
    print(list(reader)) 
[{'first_name': 'Baked', 'last_name': 'Beans'}, {'first_name': 'Lovely', 'last_name': 'Spam'}, {'first_name': 'Wonderful', 'last_name': 'Spam'}] 

Se il delimitatore non è in realtà un , è necessario specificare " " o qualunque cosa sia.

Giusto per chiarire qualsiasi confusione, il codice funziona bene per python3.6 anche, l'unica differenza è che l'utilizzo DictReaderOrderdicts di default:

In [1]: import csv 
    ...: with open("in.csv") as csvfile: 
    ...:  reader = csv.DictReader(csvfile, delimiter=" ") 
    ...:  print(list(reader)) 
    ...:  
[OrderedDict([('first_name', 'Baked'), ('last_name', 'Beans')]), OrderedDict([('first_name', 'Lovely'), ('last_name', 'Spam')]), OrderedDict([('first_name', 'Wonderful'), ('last_name', 'Spam')])] 

È possibile accedere alle chiavi esattamente lo stesso, un solo OrderedDict mantiene ordine di inserimento chiave:

In [2]: import csv 
    ...: with open("in.csv") as csvfile: 
    ...:  reader = csv.DictReader(csvfile, delimiter=" ") 
    ...:  for dct in reader: 
    ...:   print(f"{dct['first_name']} {dct['last_name']}") 
    ...:   
    ...:  
Baked Beans 
Lovely Spam 
Wonderful Spam 

Quali py3.6 in realtà lo fa troppo, quindi se per qualche motivo si vuole veramente un dict:

In [5]: import csv 
    ...: with open("in.csv") as csvfile: 
    ...:  reader = csv.DictReader(csvfile, delimiter=" ") 
    ...:  for dct in map(dict, reader): 
    ...:   print(dct) 
    ...:   print(f"{dct['first_name']} {dct['last_name']}") 
    ...:   
    ...:  
{'first_name': 'Baked', 'last_name': 'Beans'} 
Baked Beans 
{'first_name': 'Lovely', 'last_name': 'Spam'} 
Lovely Spam 
{'first_name': 'Wonderful', 'last_name': 'Spam'} 
Wonderful Spam 

La ritenzione ordinamento all'inserimento in py3.6 è un dettaglio di implementazione e possono cambiare, ma se abbastanza di noi lo usano, si può solo dovuto rimanere :)

+0

non corrette in Python 3.6, che dovrebbe usa 'print ([dict (d) per d nel lettore])' –

+0

@MattFletcher, funziona bene in py3.6, cosa non funziona per te? È perché vedi 'OrderedDict's'? –

+0

Sì, quindi non può scorrere correttamente su di esso. Non sono un maestro di Python quindi potrei mancare qualcosa di enorme, ma ho letto che il modo in cui ha funzionato è stato modificato in py3.6 - non riesco a trovare la filatura SO ... –

Problemi correlati