2015-04-03 3 views
6

CSV файл names.csv имеет содержание:Преобразование объекта csv.DictReader в список словарей?

first_name last_name 
Baked Beans 
Lovely Spam 
Wonderful Spam 

Я хотел бы, чтобы прочитать его в список словарей, с первой строки, содержащей ключи:

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

Но это тип readercsv.DictReader ? Как преобразовать reader в список словарей? Спасибо.

ответ

6

Использование list():

print(list(reader)) 

Демо:

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

Если разделитель не на самом деле , вам нужно указать " " или что-то.

Просто, чтобы очистить путаницы, код прекрасно подходит для python3.6 также работает, единственное отличие состоит в том, что с помощью DictReader дает Orderdicts по умолчанию:

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

Вы можете получить доступ ключи точно теми же самыми, OrderedDict просто сохраняет ключ порядок вставки:

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 

Какие py3.6 на самом деле делает тоже, так что если по какой-то причине вы действительно хотите 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 

Сохранение упорядочения при вставке в py3.6 является деталью реализации и может измениться, но если достаточно многие из нас использует его, он может просто остаться :)

+0

Не правильно с Python 3.6, который должен используйте 'print ([dict (d) для d в читателе])' –

+0

@MattFletcher, он отлично работает в py3.6, что не работает для вас? Это потому, что вы видите «OrderedDict»? –

+0

Да, и поэтому не может правильно перебирать его. Я не являюсь мастером Python, поэтому мне может не хватать чего-то массивного, но я читал, что они как-то изменились в py3.6 - не может для меня жизнь найти SO-поток ... –

Смежные вопросы