web-dev-qa-db-ja.com

csv.DictReaderオブジェクトを辞書のリストに変換しますか?

CSVファイルnames.csvコンテンツがあります:

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.DictReaderreaderを辞書のリストに変換するにはどうすればよいですか?ありがとう。

17
Tim
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も実際に行うので、何らかの理由で実際に辞書が必要な場合:

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での挿入時の順序保持は実装の詳細であり、変更される可能性がありますが、十分に使用する場合はそのままにしておく必要があります: )

22

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