我正在使用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>
答案 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
的值而不是每次通话的tuple
和itemgetter
返回,请明确致电:
entries = [list(get_keys(row)) for row in csv.DictReader(f_input)]