2015-04-03 9 views
6

Eine CSV-Datei names.csv hat Inhalt:Konvertieren Sie ein csv.DictReader-Objekt in eine Liste von Wörterbüchern?

first_name last_name 
Baked Beans 
Lovely Spam 
Wonderful Spam 

Ich möchte es in eine Liste von Wörterbüchern lesen, mit der ersten Reihe die Schlüssel enthalten:

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

aber ist die Art von readercsv.DictReader ? Wie kann ich reader in eine Liste von Wörterbüchern konvertieren? Danke.

Antwort

6

Verwendung 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'}] 

Wenn das Trennzeichen ist nicht wirklich ein , Sie brauchen " " angeben oder was auch immer es ist.

einfach keine Verwirrung zu löschen, der Code funktioniert für python3.6 auch in Ordnung, ist der einzige Unterschied, dass DictReader mit Orderdicts standardmäßig gibt:

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

Sie Schlüssel zugreifen können genau das gleiche, ein OrderedDict nur hält Schlüsselauftrag:

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 

Welche tatsächlich tut py3.6 auch, also wenn aus irgendeinem Grund wollen Sie wirklich ein 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 

Die Bestell Retention beim Einsetzen in py3.6 ist ein Implementierungsdetail und können sich ändern, aber wenn genug von uns es verwenden, es kann nur mit Python 3.6 :)

+0

nicht korrekt bleiben der sollte benutze 'print ([dict (d) für d im reader])' –

+0

@MattFletcher, es funktioniert gut in py3.6, was funktioniert nicht für dich? Ist es, weil Sie 'OrderedDict's sehen? –

+0

Ja, und kann daher nicht richtig durchlaufen werden. Ich bin kein Python-Meister, also mag ich etwas Großes vermissen, aber ich habe gelesen, dass die Art, wie es funktioniert hat, in py3.6 geändert wurde - kann nicht für das Leben von mir den SO-Thread finden ... –

Verwandte Themen