如何将 zipfile 作为 django 中的 File 对象?

Posted

技术标签:

【中文标题】如何将 zipfile 作为 django 中的 File 对象?【英文标题】:How to take a zipfile as a File object in django? 【发布时间】:2016-03-13 20:20:46 【问题描述】:

我有一个名为“src”的文件夹,我在其中创建了一个名为 zf 的 zip 文件。我想将 zf 作为 FileField 对象传递给 newobj.fd。

                import zipfile
                from django.core.files import File

                f='s1.zip'
                zf = zipfile.ZipFile(f, "w")
                for dirname, subdirs, files in os.walk(src):
                    zf.write(dirname)
                    for filename in files:
                        zf.write(os.path.join(dirname, filename))
                        zf.open(os.path.join(dirname, filename))
                newobj.fd= File(zf)

我为一个文本文件做这件事,它可以工作:

                f=file('text.txt')
                newobj.fd2=File(f)
                f.close()

如何为 zipfile 做同样的事情?

【问题讨论】:

【参考方案1】:
            import zipfile
            from django.core.files import File

            f='s1.zip'
            zf = zipfile.ZipFile(f, "w")
            for dirname, subdirs, files in os.walk(src):
                zf.write(dirname)
                for filename in files:
                    zf.write(os.path.join(dirname, filename))
            zf.close()
            newobj.fd = File(f)

这有什么作用?

【讨论】:

我在尝试了您的答案后这样做了,但它给出了错误:I/O operation on closed file。我删除了 zf.close() 但错误仍然存​​在。 给出完整的回溯(复制和粘贴)。您确定 newobj.fd = 代码正确缩进了吗? 我删除了 zf.close() 并将其替换为 zf.open(os.path.join(dirname, filename))。现在的问题是,即使没有弹出错误,但 zip 文件没有被复制到所需的位置。另一方面,文本文件被正确复制。 我改变了答案。我将关闭移出循环。添加第一个文件后它关闭了。什么是newobj? 仍然报错:I/O operation on closed file

以上是关于如何将 zipfile 作为 django 中的 File 对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何将动态生成的pdf文件添加到zipfile Python?

您如何将 zip 文件中的文件作为文本而不是字节读取?

Python - 将内存中的 ZipFile 对象加载为字节

如何修复 Colaboratory 中的 zipfile 读取错误?

python zipfile 是线程安全的吗?

Django:使用 django-storage 从 S3 创建 zipfile