2010-07-26 109 views
2

我有一個CSV文件,其中第一行包含變量名稱,其餘行包含數據。什麼是將它分解成Python中只包含一個變量的文件的好方法?這個解決方案會變得強大嗎?例如。如果輸入文件大小爲100G會怎樣?我試圖執行分治策略,但是對Python來說是新手。在此先感謝您的幫助!如何將大型CSV數據文件分解爲單個數據文件?

輸入文件看起來像

var1,var2,var3 
1,2,hello 
2,5,yay 
... 

我要創建3(或包含很多變量)的文件var1.csv,var2.csv,var3.csv ,使文件類似於 文件1

var1 
1 
2 
... 

文件2

var2 
2 
5 
... 

文件3

var3 
hello 
yay 
+2

想要這樣做可能會比實現更多的問題 – 2010-07-26 01:16:03

回答

2

由於lomg的列數並不是很荒謬(大於你可以打開的文件數一次在你的平臺上),行數和總大小都沒有什麼大不了的(當然,因爲你有足夠的磁盤空間;-),因爲你一次只能處理一列 - - 我建議以下代碼:

import csv 

def splitit(inputfilename): 
    with open(inputfilename, 'rb') as inf: 
    inrd = csv.reader(inf) 
    names = next(inrd) 
    outfiles = [open(n+'.csv', 'wb') for n in names] 
    ouwr = [csv.writer(w) for w in outfiles] 
    for w, n in zip(ouwr, names): 
     w.writerow([n]) 
    for row in inrd: 
     for w, r in zip(ouwr, row): 
     ouwr.writerow([r]) 
    for o in outfiles: o.close() 
+3

輕微nitpicks:我想你的意思是w.writerow而不是ouwr.writerow - w是列表中的csvwriter實例:ouwr。另外,嵌套循環「zip(ouwr,r)」應該是「zip(ouwr,row)」,而outfile中的o應該用於outfiles。 另外,它的工作原理。 – bhangm 2010-07-26 01:38:00

+0

我不得不使用一些代碼來使它工作。讓我測試一個非常大的數據集,然後我會給你你應該得到的分數!謝謝 – xiaodai 2010-07-26 10:13:28

+0

@bhangm,感謝您發現問題 - 編輯修復它們,並+1, - ) – 2010-07-26 19:33:25

1

打開n個輸出文件,一個輸入文件,並讀一次一條線。將排列順序排列並將n個作品寫入每個文件。你每次只在內存中存儲一​​行,(並且我認爲這行不是100GB?)

1

如果Python是不是必須的,

awk -F"," 'NR==1{for(i=1;i<=NF;i++)a[i]=$i}NR>1{for(i=1;i<=NF;i++){print $i>a[i]".txt"}}' file 
+0

awk會比Python更快嗎? – xiaodai 2010-07-26 10:16:05

+1

是的。大多數時候。 – ghostdog74 2010-07-26 10:46:57

+0

我是一個完整的noob。 Windows上的awk實現是什麼? – xiaodai 2010-07-26 11:29:29

1

如果你的文件是100GB,那麼盤IO將是你的瓶頸。考慮使用gzip module來讀取(一個預壓縮文件)和寫入以大幅度加快速度。

+0

謝謝你。有用!我正在做一個SSD,它仍然很慢。有時可能會給gzip一個破解 – xiaodai 2010-07-26 10:18:23

相關問題