2016-12-19 17 views
1

我有類似結構的相當大的逗號分隔 csv文件到:移調CSV同時保持ID

ZipCd Var1 Var2 Var 3 
12345 12 45 10 
67890 13 23 5 
    . .  . . 
    . .  . . 
    . .  . . 
30010 99 17 6 

對於每個ZipCd有許多變量會向右(約250總變量)。我想對於要產生以下的輸出:

ZipCd Var Value 
12345 1 12 
12345 2 45 
12345 3 10 
67890 1 13 
67890 2 23 
67890 3 5 
30010 1 99 
30010 2 17 
30010 3 6 

我已經嘗試以下操作:

with open("file.csv") as f, open("out.csv","w") as out: 
    headers = next(f).split()[0:] #Get first row of original csv for headers and variable names 
    for row in f: 
     row = row.split(",") #split row into values delimitted by comma 
     ZipCd = row[0] 
     Var1 = row[1] 
     Var2 = row[2] 
     Var3 = row[3] 
     data = zip(headers, row[1:]) 
     for a, b in data: 
     out.write("{} {} {}\n".format(ZipCd,a,b)) 

和產生:

12345 ZipCd,Var1,Var2,Var3 12 
67890 ZipCd,Var1,Var2,Var3 13 

生產所需的輸出任何幫助不勝感激。

+0

我不明白:是你的輸入文件逗號分隔或空格分隔? –

+0

逗號,對不起。應該更加明確。 – Daniel

+0

我從你得到的錯誤中猜出它! –

回答

1

似乎與輸入文件分隔符有混淆。這顯然是逗號,但是您不使用參數分割標題:標題不分割,並且包含所有字段,逗號分隔。

我使用csv模塊讀取輸入文件,更清潔的提出解決方案

  • 接受盡可能多的變量使用zip像你這樣爲「轉」的數據
  • 漂亮的把戲for zipcd,*vars in cr用於獲取zipcd爲第一場和vars爲剩餘的字段(稱爲擴展可迭代開箱希望
  • 又名 「*目標,功能」 爲馬蒂諾在另一個答案解釋今天)

代碼:

import csv 

with open("file.csv") as f, open("out.csv","w") as out: 
    cr = csv.reader(f) # default separator is comma 
    variable_names = next(cr)[1:] # ignore first field in the title line 
    out.write("ZipCd Var Value\n") 
    for zipcd,*vars in cr: 
     for vn,vv in zip(variable_names,vars): # interleave data 
      out.write("{} {} {}\n".format(zipcd,vn,vv)) 

樣本輸入:

ZipCd,Var1,Var2,Var3 
12345,12,45,10 
67890,13,23,5 
30010,99,17,6 

結果輸出:

ZipCd Var Value 
12345 Var1 12 
12345 Var2 45 
12345 Var3 10 
67890 Var1 13 
67890 Var2 23 
67890 Var3 5 
30010 Var1 99 
30010 Var2 17 
30010 Var3 6 
+0

使用您的代碼,zipcd何時或如何分配給輸入csv的第一列中的值? – Daniel

+0

我的回答的最後一個項目符號:'對於zipcd,* cr in'指定'zipcd'_和_VAR。 –

+0

好的,我期待'zipcd = cr [0]'或類似的聲明。仍然理解'python'的機制。 – Daniel

相關問題