我有一些大的csv文件,有大约200个标题名称(第一个是空的)。 我想获得一些选定的列并将它们复制到新的output.csv文件中。我的问题是抓住没有名字的标题! (标题中的第一个空元素)
所以input.csv看起来像,
,header1,header2,header3,header4, ... , header200
value0, value2, value2, value3, value4, ..., value200
,2,3,30,,, ... , 10
66,2,3,30,, ... , 10
etc(即使为空,所有行的元素数也相同)。
在阅读了各种问题后,我回收了一些代码 write CSV columns out in a different order in Python
写,
import csv
from operator import itemgetter
SelectedSignals = ['header1', 'header4']
fiin=open('input.csv','rb') #open to read "r" in binary mode "b"
fiout=open('output.csv','wb') #open to write "w" in binary mode "b"
reader = csv.reader(fiin, delimiter=',')
writer = csv.writer(fiout, delimiter=',')
AllSignalNames = reader.next()
name2index = dict((name, index) for index, name in enumerate(AllSignalNames))
writeindices = [name2index[name] for name in SelectedSignals]
reorderfunc = itemgetter(*writeindices) # itemgetter was imported from operator module
writer.writerow(SelectedSignals)
for row in reader:
writer.writerow(reorderfunc(row))
这给出了所需的输出, 比方说,
,header1,header4
value0, value4
,30
66,30
但问题在于,
SelectedSignals = [' ', 'header1', 'header4']
抓住第一列。返回 KeyError
我是初学者,所以任何提示都会受到赞赏。
答案 0 :(得分:1)
在CSV格式中,第一个标题应为零长度字符串(''
),而不是空格(' '
),这是您在SelectedSignals
中使用的。 / p>
您还可以在name2index
dict之后添加假名列,例如name2index['header0'] = 0
之后的name2index = ...
,然后在'header0'
中使用SelectedSignals
。< / p>
或者,你可以使用dict的默认值(当它找不到你想要的标题时,它会使用这个默认值):name2index.get(name, 0)
而不是你name2index[name]
writeindices
1}}表达。