2

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

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

我想向实用程序传递一个上传的 csv 文件,上传的文件可以在内存中(如果它足够小)或在临时存储区域中。CSVJSON 看起来需要一个文件路径或流。如果有人能告诉我我需要对上传的文件执行哪些操作以使 CSVJSON 能够使用它,那将是一个很好的奖励。

在 django 1.3 中,我计划在 form_valid 方法中完成这项工作。

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

4

1 回答 1

5

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

from csvkit.utilities.csvjson import CSVJSON

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

argparser 模块用于解析命令行参数,因此它的文档会很有帮助。简短的版本就像将您在实际命令行中使用的原始参数字符串用空格分开一样。例如:

$ 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 对象替换为您的内存版本。唯一的规定是对象的行为必须像输入文件。假设您在名为input_string的变量中有 CSV 文件的字符串版本,您可以使用StringIO 库来创建字符串缓冲区:

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 不会为您关闭它。

于 2012-06-18T04:59:46.743 回答