2015-04-03 15 views
6

pliku CSV names.csv ma zawartość:Konwertuj obiekt csv.DictReader na listę słowników?

first_name last_name 
Baked Beans 
Lovely Spam 
Wonderful Spam 

Chciałbym ją przeczytać w liście słowników, z pierwszego wiersza zawierającego kluczy:

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

Ale to rodzaj readercsv.DictReader ? Jak przekonwertować reader na listę słowników? Dzięki.

Odpowiedz

6

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

Jeśli separator nie jest faktycznie , trzeba określić " " lub cokolwiek to jest.

Wystarczy, aby usunąć wszelkie nieporozumienia, kod działa dobrze dla python3.6 też, jedyną różnicą jest to, że za pomocą DictReader daje Orderdicts domyślnie:

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

Można uzyskać dostęp do kluczy dokładnie to samo, tylko OrderedDict trzyma klucz kolejność wstawiania:

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 

które py3.6 faktycznie nie zbyt, więc jeśli z jakiegoś powodu naprawdę chcesz 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 

Retencja zamawianie na wstawkę w py3.6 jest szczegółowo realizacja i może się zmienić, ale jeśli wystarczy nam go używać, to może po prostu pozostać :)

+0

nie zgadza z Python 3.6, który powinien użyj 'print ([dict (d) dla d w czytniku])' –

+0

@MattFletcher, działa dobrze w py3.6, co nie działa dla ciebie? Czy to dlatego, że widzisz 'OrderedDict's'? –

+0

Tak, i dlatego nie można go poprawnie iterować. Nie jestem mistrzem Pythona, więc być może brakuje mi czegoś masywnego, ale przeczytałem, że sposób, w jaki działał został zmieniony w py3.6 - nie mogę na całe życie znaleźć wątku SO ... –