【问题标题】:Good ways to handle dynamic zipfile creation in Python在 Python 中处理动态 zipfile 创建的好方法
【发布时间】:2014-03-21 19:51:46
【问题描述】:

我的 Web 应用程序有一个报告功能,它受到了功能蠕变的影响——现在它必须提供一个包含各种文档的 .zip 文件,而不是提供 PDF。

生成文档没问题。向 Zipfile 添加文档是个问题。

到目前为止,要添加到存档中的各种文档以cStringIOStringIOtempfile.SpooledTemporaryFile 对象的组合形式存在。

深入研究zipfile 库文档,似乎模块的[write][1] 函数仅适用于Strings 或机器上物理文件的路径;它不适用于类似文件的对象。

要明确一点:zipfile 可以像存档本身一样从类文件对象读取/写入 (zipfile.ZipFile),但是当向存档添加元素时,库仅支持路径名或原始字符串数据.

我发现了一篇在线博客文章,其中建议了一种可能的解决方法,但我并不急于在我的生产机器上使用它。 http://swl10.blogspot.com/2012/12/writing-stream-to-zipfile-in-python.html

有没有人有其他策略来处理这个问题?看起来我必须要么将所有内容保存到磁盘并在 I/O 上受到打击,要么将所有内容作为字符串处理并在内存上受到打击。两者都不理想。

【问题讨论】:

  • 您有什么特别的理由不信任您链接的解决方案吗?它对我来说看起来很可靠 - 它添加到 os.stat__builtin__.open 的钩子绝对不会做任何事情,除非通过了虚拟文件类。
  • 我一般不喜欢猴子补丁,这个猴子补丁标准库。如果我只是运行一个孤立的脚本,我不会在意。这是大型 Web 服务项目的一部分,可以从其中一个异步守护程序调用。即使需要 VirtualClass,我仍然有点担心。这种担忧可能是没有根据的,我很乐意学习其他方式。从一篇随机博客文章中引入代码,monkeypatches os 是我宁愿让其他人参与进来的东西。

标签: python python-2.7 zipfile


【解决方案1】:

使用您所指的解决方案(使用猴子路径)。

关于您对monkeypathing 听起来不够可靠的担忧:请详细说明如何从其他地方使用monkeypatched 方法。

在 Python 中挂钩并不是什么特别的魔法。这意味着,有人将替代价值/功能分配给已经定义的东西。这必须通过一行代码来完成,而且范围非常有限。

在博客的示例中,monkeypatched os 函数的范围只是 ZipHooks 类。

不要害怕,它会在您不知情的情况下泄漏到其他地方或破坏整个系统。即使是其他包,使用 ZipHooks 类导入您的模块也无法访问路径 statopen,除非他们会使用 ZipHooks 类或从您的包中显式调用 stat_hookopen_hook

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2015-08-08
    • 2022-12-24
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多