csvkit&django又称使用csvkit作为模块而不是命令行

w--*_*w-- 2 python csv django django-views

我需要在django应用程序中执行一些csv文件处理.
我听说过csvkit,看起来很酷.
github页面

想尝试一下,但我不知道如何使用csvkit作为模块.具体来说,我想使用CSVJSON实用程序.我需要传递一个csv文件(并希望其他一些参数),但不能弄清楚如何做到这一点.
CSV JSON文档

我想传递实用程序上传的csv文件,上传的文件可能在内存中(如果它足够小)或临时存储区域.CSVJSON看起来像需要文件路径或流.如果有人可以告诉我我需要对上传的文件做什么,CSVJSON能够使用它,这将是一个很好的奖励.

在django 1.3中,我计划在form_valid方法中完成工作.

希望有一些python技能的人可以帮助告诉我我需要做什么.谢谢

Joe*_* C. 5

您可以使用以下代码导入CSVKit JSON类:

from csvkit.utilities.csvjson import CSVJSON
Run Code Online (Sandbox Code Playgroud)

CSVKit类有2个构造函数选项; 第一个是命令行参数列表,第二个是输出流.如果未提供输出流,则会打印到标准输出.

argparser模块用于解析命令行参数,因此它的文档将很有用.简短的版本是,它就像拆分你在实际命令行中使用的原始参数字符串一样.例如:

$ csvjson --key Date /path/to/input/file
Run Code Online (Sandbox Code Playgroud)

将转化为:

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

如果您不想从输入文件中读取,但无法从命令行将输入文件传递到stdin,则可以使用内存中的版本替换sys.stdin对象.唯一的规定是对象必须像输入文件一样.假设您在名为input_string的变量中具有CSV文件的字符串版本,则可以使用StringIO库来创建字符串缓冲区:

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

最后,如果要打印到文件而不是stdout,请将打开的文件对象作为第二个参数传递:

output_file = open("/path/to/output.txt", "w")
CSVJSON(args, output_file).main()
output_file.close()
Run Code Online (Sandbox Code Playgroud)

请记住,在您自己关闭文件对象之前,它不会刷新缓冲区; CSVJSON不会为您关闭它.