【问题标题】:csvkit & django a.k.a. using csvkit as modules instead of from command linecsvkit & django a.k.a. 使用 csvkit 作为模块而不是从命令行
【发布时间】:2012-04-23 08:17:33
【问题描述】:

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

想尝试一下,但我不知道如何将 csvkit 作为模块使用。具体来说,我想使用 CSVJSON 实用程序。我需要向它传递一个 csv 文件(希望还有一些其他参数),但我不知道该怎么做。
CSV JSON Docs

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

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

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

【问题讨论】:

    标签: python django csv django-views


    【解决方案1】:

    您可以使用以下代码导入 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 对象替换为您的内存版本。唯一的规定是对象的行为必须像输入文件。假设您在名为 input_string 的变量中有 CSV 文件的字符串版本,您可以使用 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 不会为您关闭它。

    【讨论】:

    • 嗨,我现在才看到这个。哈哈。我还没有尝试过,但是阅读您的解释看起来这将完全有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    相关资源
    最近更新 更多