2012-04-11 27 views
2

我需要在django應用程序中執行一些csv文件處理。
我聽說過csvkit,它看起來很酷。
github pagecsvkit&django a.k.a.使用csvkit作爲模塊而不是從命令行

想嘗試一下,但我不知道如何使用csvkit作爲模塊。具體來說,我想使用CSVJSON實用程序。我需要傳遞一個csv文件(希望有其他參數),但不能完全弄清楚如何做到這一點。
CSV JSON Docs

我想通過該實用程序上傳的csv文件,上傳的文件可能在內存中(如果它足夠小)或臨時存儲區域中。 CSVJSON看起來像需要一個文件路徑或流。如果有人能告訴我需要對上傳的CSVJSON文件進行消費,那將是一個不錯的獎勵。

在django 1.3我打算做form_valid方法的工作。

希望有人使用一些python技能可以幫助告訴我我需要做什麼。 感謝

回答

5

您可以使用下面的代碼導入CSVKit JSON類:

from csvkit.utilities.csvjson import CSVJSON 

的CSVKit類取2個構造選項;第一個是命令行參數列表,第二個是輸出流。如果未提供輸出流,則會打印到標準輸出。

argparser模塊用於解析命令行參數,因此it's documentation將會有所幫助。簡短的版本就是,它就像將你在實際命令行中使用的參數的原始字符串拆分爲空格一樣。例如:

$ csvjson --key Date /path/to/input/file 

將轉化爲:

from csvkit.utilities.csvjson import CSVJSON 
args = ["--key", "Date", "/path/to/input/file"] 
CSVJSON(args).main() 

如果你不想從輸入文件中讀取,但不能輸入文件在命令行傳遞到標準輸入,您可以用您的內存版本替換sys.stdin對象。唯一的規定是該對象必須像輸入文件一樣行爲。假設你有CSV文件的字符串版本在一個名爲變量input_string,則可以使用StringIO library創建一個字符串緩衝區:

import StringIO 
import sys 
new_stdin = StringIO.StringIO(input_string) 
sys.stdin = new_stdin 
args = ["--key", "Date"] 
CSVJSON(args).main() 

最後,如果你要打印到文件,而不是標準輸出,通過一個打開的文件對象作爲第二個參數:

output_file = open("/path/to/output.txt", "w") 
CSVJSON(args, output_file).main() 
output_file.close() 

記住,直到關閉該文件對象自己也不會刷新緩衝區; CSVJSON不會爲你關閉它。

+0

嗨,我只看到這個。哈哈。我沒有嘗試過,但是閱讀你的解釋看起來是完全有效的。謝謝! – 2014-03-11 01:02:42