使用Python以相同的顺序从CSV创建字典列表

时间:2017-12-08 05:14:40

标签: python list csv dictionary

考虑使用CSV,

col1, col2, col3
1000, Star, True
2000, Moon, False

如何按照与此相同的顺序创建字典列表

[{'col1': '1000', 'col2': 'Star', 'col3': 'TRUE'}, {'col1': '2000', 'col2': 'Moon', 'col3': 'FALSE'}]

我尝试使用以下代码但未按相同顺序

with open('sample.csv') as f:
    rows = [{k: v for k, v in row.items()}
        for row in csv.DictReader(f, skipinitialspace=True)]

输出上述代码,

[{'col2': 'Star', 'col3': 'TRUE', 'col1': '1000'}, {'col2': 'Moon', 'col3': 'FALSE', 'col1': '2000'}]

是否有任何解决方案可以获得相同的顺序?

谢谢!

1 个答案:

答案 0 :(得分:0)

由于字典本质上是无序的,因此您需要在列表中的每个字典上包装OrderedDict,这需要事先进行排序:

import csv
from collections import OrderedDict

with open('sample.csv') as f:
    rows = [OrderedDict(sorted(dict((k, v) for k, v in row.items()).items())) for row in csv.DictReader(f, skipinitialspace=True)]

>>> print(rows)
[OrderedDict([('col1', '1000'), ('col2', 'Star'), ('col3', 'True')]), OrderedDict([('col1', '2000'), ('col2', 'Moon'), ('col3', 'False')])]

并且正常工作:

>>> print(rows[0]['col1'])
1000
>>> print(rows[1]['col1'])
2000
print([key for key in rows[0]])
['col1', 'col2', 'col3']

注意:您无法使用普通字典替换输出中的OrderedDict()包装,否则它将再次无序。如果我们想在python中使用有序词典,这是我们必须支付的价格之一。