我想在ZipFile中存储一个ZipFile,当我使用.write方法来编写ZipFile对象时,我得到了一个错误:“预期的字符串、字节或os.PathLike对象,而不是ZipFile”。
>>> from io import StringIO
>>> import zipfile
>>> child_zip = zipfile.ZipFile(StringIO(), 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=True)
>>> parent_zip = zipfile.ZipFile(zipfile.ZipFile, 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=True)
>>> parent_zip.write("test.zip",child_zip)
发布于 2020-05-29 23:41:15
首先:
ZipFile.write
方法需要一个文件名作为其第一个参数,然后它将打开该文件并从该文件中读取数据,将其写入存档。您需要使用writestr
方法将原始数据写入parent_zip
。
第二:
您将像这样创建parent_zip
:
parent_zip = zipfile.ZipFile(zipfile.ZipFile, 'w',
compression=zipfile.ZIP_DEFLATED, allowZip64=True)
但是zipfile.ZipFile
的第一个参数应该是“文件的路径,或者一个类似文件的对象”。你正在通过一个类,这没有任何意义。如果想要创建一个内存中的压缩文件,可以传入另一个StringIO
实例,也可以提供一个文件名。
第三:
您不能将child_zip
对象本身写入文件;您需要提供某种类型的字节流。换句话说,您需要提供组成child_zip
存档的字节数。
把所有这些放在一起:
>>> import io
>>> import zipfile
>>> child_zip_data = io.BytesIO()
>>> child_zip = zipfile.ZipFile(child_zip_data, 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=True)
>>> child_zip.close()
>>> parent_zip = zipfile.ZipFile("parent.zip", 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=True)
>>> parent_zip.writestr("test.zip", child_zip_data.getvalue())
>>> parent_zip.close()
这将创建一个名为parent.zip
的新归档文件,其中包含一个名为test.zip
的归档成员
$ unzip -l parent.zip
Archive: parent.zip
Length Date Time Name
--------- ---------- ----- ----
22 05-29-2020 11:45 test.zip
--------- -------
22 1 file
如果我们提取test.zip
,我们会发现它是一个空的压缩文件:
$ unzip parent.zip
Archive: parent.zip
inflating: test.zip
$ unzip -l test.zip
Archive: test.zip
warning [test.zip]: zipfile is empty
https://stackoverflow.com/questions/62089350
复制相似问题