2011-09-28 60 views
0

我願做一個類似的過程在this question詳細csv文件,但我得到一個錯誤信息說:重新排序包含浮點,整數和文本數據的csv文件的列?

TypeError: list indices must be integers 

,我想重新擁有浮動的組合CSV文件,文本,和整數數據類型。我假設這是問題,但不能找出一種方法來修改下面的代碼插入數據。它將頭部信息寫入新的CSV文件。

我使用相同的代碼由約翰·馬金的建議,但我寫的名字變量用途:

writenames = "ID,average,max,min,median,mode,stddev,skewness,kurtosis".split(",") 
reader = csv.reader(open("/home/usrs/chris/Summary.csv", "rb")) 
writer = csv.writer(open("/home/usrs/chris/SummaryNEW.csv", "wb")) 
readnames = reader.next() 
names2indicies = dict((name,index) for index, name in enumerate(readnames)) 
writeindices = [names2string[name] for name in writenames] 
reorderfunct = operator.itemgetter(writeindices) 
writer.writerow(writenames) 
for row in reader: 
    writer.writerow(reorderfunct(row)) 
+2

發佈您的代碼,以及您的輸入;只是不要引用其他帖子 –

+1

如果您能夠:發佈您的實際代碼,包括指示錯誤發生在哪一行的錯誤消息的部分以及觸發該錯誤的一行或兩行樣本數據,這將有所幫助。 – larsks

+1

我傾向於將Python用於幾乎所有的腳本編寫需求,但這是其中'awk'可能是工作更好的工具(假設您只需對列重新排序)的情況之一。 – NPE

回答

2

operator.itemgetter()是所有你需要:

inp=csv.reader(open(...)) 
outp=csv.writer(open(...)) 
map(outp.writerow,map(operator.itemgetter(x,y,z),inp)) 

其中x ,y,z是你想重新排列的列。

但是,由於Summary.csv第一行頭,那麼你可以考慮使用DictReader和DictWriter:

writenames = "ID,average,max,min,median,mode,stddev,skewness,kurtosis".split(",") 
reader = csv.DictReader(open("/home/usrs/chris/Summary.csv", "rb")) 
writer = csv.DictWriter(open("/home/usrs/chris/SummaryNEW.csv", "wb"), \ 
    fieldnames=writenames) 
reorderfunct = lambda r: dict([(col, r[col]) for col in writenames]) 
writer.writeheader() 
for row in reader: 
    writer.writerow(reorderfunct(row)) 
+0

請勿使用'map'替換循環;你違反了'zen [1]'。 'map'用於將列表轉換爲其他列表。 –

+2

@oxtopus:感謝DictReader和DictWriter解決方案!現在唯一的問題是writer.writeheader()不起作用。註釋該行重新排列csv,但顯然輸出沒有標題。 – Czed

+0

爲什麼它不起作用,錯誤是什麼? –

相關問題