2011-11-08 7 views
0

私は、約200のヘッダ名(最初は空です)を持つ大きなcsvファイルを持っています。 いくつかの選択した列を取得し、それらを新しいoutput.csvファイルにコピーしたいとします。私の問題は名前のないヘッダーをつかむことになる! (ヘッダー内の空の最初の要素)python:1つのヘッダが空のときに、選択されたcsvカラムを他のcsvファイルにコピーします。

のでinput.csvは何かのように、

  ,header1,header2,header3,header4, ... , header200 
      value0, value2, value2, value3, value4, ..., value200 
      ,2,3,30,,, ... , 10 
      66,2,3,30,, ... , 10 

などを(すべての行が空であっても、同じ数の要素を持っている)になります。

は、様々な質問を読んだ後、私は書くこと 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

私はPythonの初心者ですので、どのようなヒントも高く評価されています。

答えて

1

CSV形式では、最初のヘッダーは、長さ0の文字列('')でなければならず、SelectedSignalsで使用するスペース(' ')ではありません。

また、単にname2index = ...後たとえばname2index['header0'] = 0のために、あなたのname2index辞書に偽の列名を追加し、SelectedSignals'header0'を使用することができます。 name2index.get(name, 0)の代わりに、あなたのwriteindices式にname2index[name]

代わりに、dictの(それはあなたがしたいヘッダを見つけることができないとき、それはこのデフォルト値を使用する)のためのデフォルト値を使用することができます。

+0

ありがとうございます。 'name2index.get(name、0)'が最適です。 – Massagran

関連する問題