2015-04-03 108 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还可以,唯一的区别是使用DictReaderOrderdicts默认:

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确实太少,因此,如果由于某种原因,你真的想要一个字典:

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)for d in reader])' – 2017-12-07 16:12:41

+0

@MattFletcher,它在py3.6中工作正常,什么不适合你?是因为你看到OrderedDict's'吗? – 2017-12-07 16:39:01

+0

是的,因此无法正确地迭代它。我不是一个Python大师,所以我可能会错过一些巨大的东西,但我读到它们的工作方式已在py3.6中改变 - 不能为我的生活找到SO线程... – 2017-12-07 16:41:47