2012-01-03 66 views
1

我正在創建一個將大量數據轉換爲CSV格式的腳本。它使用mapreduce API在Google AppEngine上運行,該API僅與相關,因爲它意味着每行數據在回調函數中分別格式化並輸出。將單行格式化爲CSV

我想利用csv模塊中已有的邏輯將我的數據轉換爲正確的格式,但由於CSV編寫器需要類似文件的對象,因此我必須爲每個對象實例化一個StringIO行,將行寫入對象,然後每次返回對象的內容。

這似乎很愚蠢,我想知道是否有任何方式來訪問csv模塊的內部CSV格式化邏輯沒有寫作部分。

+0

'tempfile'模塊有幫助嗎?你可以給出一個文件句柄,它在OS – wim 2012-01-03 11:11:32

+0

@wim中並不真正可見。謝謝,但不是真的。我仍然需要爲每一行單獨一個,即使它不適用於AppEngine上無法訪問文件系統的事實。 – 2012-01-03 11:28:51

+0

從來沒有看過mapreduce,所以我不確定約束,特別是當涉及到回調執行環境時。您的程序(提供回調的程序)是否在整個調用mapreduce期間運行? IE瀏覽器。你能保持全局狀態嗎?還是你真的需要重新實例化一下像'StringIO'這樣的東西? (不建議保留全局對象,介意你,這只是我想知道的環境) – 2012-01-03 11:51:00

回答

3

csv模塊包裝_csv模塊,它是用C語言編寫的。你可以爲它獲取源代碼並修改它不需要類似文件的對象,但是在模塊中查找,我沒有看到任何明確的方式來做到這一點而不需要重新編譯。

+0

(此處App Engine變得非常相關,因爲您無法部署重新編譯的C擴展) – geoffspear 2012-01-03 11:15:53

3

一個選項可能是擁有自己的「文件」對象。其實,cvs.writer需要的對象只能有一個write方法,所以:

class PseudoFile(object): 
    def write(self, string): 
     # Do whatever with your string 

csv.writer(PseudoFile()).writerow(row) 

你跳過有幾個步驟,但也許這是你想要什麼。