将csv.DictReader对象转换为字典列表?

Tim*_*Tim 18 python csv dictionary

csv文件names.csv包含以下内容:

first_name last_name
Baked Beans
Lovely Spam
Wonderful Spam
Run Code Online (Sandbox Code Playgroud)

我想把它读成一个字典列表,第一行包含键:

>>> 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
Run Code Online (Sandbox Code Playgroud)

但是这种类型reader csv.DictReader?我怎样才能转换reader成字典列表?谢谢.

Pad*_*ham 22

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'}]
Run Code Online (Sandbox Code Playgroud)

如果分隔符实际上不是,您需要指定的分隔符" "或任何分隔符.

只是为了清除任何混淆,代码也适用于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')])]
Run Code Online (Sandbox Code Playgroud)

您可以完全相同地访问密钥,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
Run Code Online (Sandbox Code Playgroud)

哪个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
Run Code Online (Sandbox Code Playgroud)

在py3.6中插入时的订购保留是一个实现细节,可能会改变,但如果我们足够多的人使用它,它可能只需要保持:)


ale*_*cxe 11

用途list():

print(list(reader))
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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'}]
Run Code Online (Sandbox Code Playgroud)

  • @HNSingh 列表中的字典会更长。在上面的示例中,唯一的列是“first_name”和“last_name”。 (2认同)

小智 6

创建函数

import csv


def csv_to_dict(filename):
    result_list=[]
    with open(filename) as file_obj:
        reader = csv.DictReader(file_obj, delimiter=delimiter)
        for row in reader:
            result_list.append(dict(row))
    return result_list
Run Code Online (Sandbox Code Playgroud)

并使用它:

list_of_dicts = csv_to_dict('names.csv')
Run Code Online (Sandbox Code Playgroud)


Nin*_*nga 6

csv.DictReader 创建一个 dictreader 对象,如标题所示。该对象仅在文件打开且无法切片时可用。

根据标题将对象转换为列表......

list_of_dicts = list(your_dictreader_object)
Run Code Online (Sandbox Code Playgroud)