我的Web应用程序上有一个报告功能,该功能已经过Feature Creep - 而不是提供PDF,它现在必须提供包含各种文档的.zip文件。
生成文档很好。将文档添加到Zipfile是个问题。
到目前为止,要添加到存档的各种文档已混合使用cStringIO
,StringIO
或tempfile.SpooledTemporaryFile
个对象。
深入研究zipfile
库文档,模块的[write][1]
函数似乎只能用于Strings
或机器上物理文件的路径;它不适用于类文件对象。
为了清楚起见:zipfile
可以从类似文件的对象读取/写入归档本身(zipfile.ZipFile
),但是当向归档添加元素时,库只支持路径名或原始字符串数据。
我发现了一个在线博客帖子,建议可能的解决方法,但我并不急于在我的生产机器上使用它。 http://swl10.blogspot.com/2012/12/writing-stream-to-zipfile-in-python.html
有没有其他策略可以解决这个问题?看起来我必须将所有内容保存到磁盘并对I / O进行命中,或者将所有内容作为字符串处理并对内存进行点击。两者都不理想。
答案 0 :(得分:0)
使用您所指的解决方案(使用monkeypathing)。
关于你对monkeypathing事情的担忧听起来不够健全:请详细说明如何从其他地方使用monkeypatched方法。
用Python挂钩并不是特别的魔力。这意味着,某人为某事物分配了替代价值/功能,已经定义了什么。这必须通过一行代码完成,并且范围非常有限。
在博客的例子中,monkeypatched os函数的范围只是ZipHooks类。
不要害怕,它会在你不知情的情况下泄漏到其他地方或打破完整的系统。即使是其他软件包,使用ZipHooks类导入您的模块也无权访问pathed stat
和open
,除非他们使用ZipHooks类或明确地从您的包中调用stat_hook
或open_hook