【问题标题】:Create zip from directory using Python使用 Python 从目录创建 zip
【发布时间】:2023-09-15 00:37:01
【问题描述】:

我正在尝试使用 Python 从目录中创建一个 zip 文件。我查看了How to create a zip archive of a directory in Python?,它有效,但我还有另一个问题。所以我有这个:

MyDir
|- DirToZip
|  |- SubDir1
|  |  |- file1.txt
|  |  |- file2.txt
|  |- SubDir2
|  |  |- file3.txt
|  |  |- file4.txt
|  |- basefile.txt
|  |- mimetype
|- create_zip.py

到目前为止,这是我的create_zip.py

import os, zipfile

name = 'DirToZip'
zip_name = name + '.zip'

with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zip_ref:
    for folder_name, subfolders, filenames in os.walk(name):
        for filename in filenames:
            file_path = os.path.join(folder_name, filename)
            zip_ref.write(file_path)

zip_ref.close()

正如我所说,就代码而言,这可以正常工作,但问题是 zip 文件没有像我想要的那样创建。现在它有根文件夹DirToZip 作为文件根中的唯一文件夹和该文件夹中的其他文件。但我宁愿没有那个根文件夹,只有 zip 文件中的子文件夹。

错误(我不想要的):

DirToZip.zip
|- DirToZip
|  |- SubDir1
|  |  |- file1.txt
|  |  |- file2.txt
|  |- SubDir2
|  |  |- file3.txt
|  |  |- file4.txt
|  |- basefile.txt
|  |- mimetype

正确(我想要的):

DirToZip.zip
|- SubDir1
|  |- file1.txt
|  |- file2.txt
|- SubDir2
|  |- file3.txt
|  |- file4.txt
|- basefile.txt
|- mimetype

我尝试在with zipfile... 之后添加for file in os.listdir(name): 并更改为... in os.walk(file),但这不起作用。 zip 文件改为空。

我能做什么?

【问题讨论】:

  • zip_ref.write(filename) - 方法有额外的参数 arcname,你可以随意将其从默认更改为文件名

标签: python zip zipfile


【解决方案1】:

就这么简单:

import os, zipfile

name = 'DirToZip'
zip_name = name + '.zip'

with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zip_ref:
    for folder_name, subfolders, filenames in os.walk(name):
        for filename in filenames:
            file_path = os.path.join(folder_name, filename)
            zip_ref.write(file_path, arcname=os.path.relpath(file_path, name))

zip_ref.close()

【讨论】: