Python:如何一次将多个键传递给字典

时间:2015-11-10 23:12:01

标签: python csv

我正在使用csv.DictReader来阅读.csv文件。

csv.DictReader有一个迭代器,它将每一行作为dict返回,我知道如何使用列标题获取单列值:

CsvReaderRow[' D0']
CsvReaderRow[' D1']
CsvReaderRow[' D2']
CsvReaderRow[' D3']
CsvReaderRow[' D4']
CsvReaderRow[' D5']
CsvReaderRow[' CLOCK']
CsvReaderRow[' FRAME']

但是有没有办法用一个语句输出一堆列? 我想做

CsvReaderRow[(' D0', ' D1', ' D2', ' D3', ' D4', ' D5')]

并获取这些密钥值的list,但它会给我KeyError

我知道它正在尝试对元组进行散列并且这不是我想要的。

可以创建一个DX列表,然后使用for el in key_list索引到dict,但我想知道是否有更多的Pythonic方法。< / p>

2 个答案:

答案 0 :(得分:1)

如上所述,以下方法应该可以很好地运作:

import csv

required = ['D0', 'D1', 'D2', 'D3', 'D4', 'D5']
entries = []

with open('input.csv', 'rb') as f_input:
    for dict_row in csv.DictReader(f_input):
        entries.append([dict_row[col] for col in required])

或者更简洁一点:

with open('input.csv', 'rb') as f_input:
    entries = [[dict_row[col] for col in required] for dict_row in csv.DictReader(f_input)]

在Python 2.7.9中测试

答案 1 :(得分:0)

包括电池:operator.itemgetter。创建一个getter对象:

 get_keys = operator.itemgetter(' D0', ' D1', ' D2', ' D3', ' D4', ' D5')

然后在每一行调用结果对象:

with open('input.csv', 'rb') as f_input:  # Py3: open('input.csv', newline='')
    # list wrapper only required in Py3 (or Py2 if you imported map from future_builtins)
    entries = list(map(get_keys, csv.DictReader(f_input)))

如果你讨厌map(或者真的想要list的值而不是每次通话的tupleitemgetter返回,请明确致电:

    entries = [list(get_keys(row)) for row in csv.DictReader(f_input)]