在Python中创建.zip?

tkb*_*kbx 35 python zip zipfile

我正在尝试在我的脚本中创建一个函数,将给定源目录(src)的内容压缩为zip文件(dst).例如,目录zip('/path/to/dir', '/path/to/file.zip')在哪里/path/to/dir,/path/to/file.zip但尚不存在.我希望压缩目录本身,这使得我的情况下,所有的差异.我想压缩目录中的文件(和子目录).这就是我正在尝试的:

def zip(src, dst):
    zf = zipfile.ZipFile("%s.zip" % (dst), "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()
Run Code Online (Sandbox Code Playgroud)

这创建了一个基本上的zip /.例如,如果我压缩/path/to/dir,则解压缩zip会在其中创建一个带有"path"的目录,在该目录中使用"to"等.

有没有人有一个不会导致这个问题的功能?

我不能强调这一点,它需要压缩目录中的文件,而不是directoy本身.

and*_*otn 57

zipfile.write()方法采用一个可选arcname参数,指定zipfile中文件的名称.

您可以使用它来剥离src开头的路径.在这里,我os.path.abspath()用来确保两者src和返回的文件名os.walk()都有一个共同的前缀.

#!/usr/bin/env python2.7

import os
import zipfile

def zip(src, dst):
    zf = zipfile.ZipFile("%s.zip" % (dst), "w", zipfile.ZIP_DEFLATED)
    abs_src = os.path.abspath(src)
    for dirname, subdirs, files in os.walk(src):
        for filename in files:
            absname = os.path.abspath(os.path.join(dirname, filename))
            arcname = absname[len(abs_src) + 1:]
            print 'zipping %s as %s' % (os.path.join(dirname, filename),
                                        arcname)
            zf.write(absname, arcname)
    zf.close()

zip("src", "dst")
Run Code Online (Sandbox Code Playgroud)

使用这样的目录结构:

src
??? a
    ??? b
    ?   ??? bar
    ??? foo
Run Code Online (Sandbox Code Playgroud)

脚本打印:

zipping src/a/foo as a/foo
zipping src/a/b/bar as a/b/bar
Run Code Online (Sandbox Code Playgroud)

并且生成的zip文件的内容是:

Archive:  dst.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  01-28-13 11:36   a/foo
        0  01-28-13 11:36   a/b/bar
 --------                   -------
        0                   2 files
Run Code Online (Sandbox Code Playgroud)

  • @tkbx:`来自os import path`将`path`放在顶层,所以你可以做`path.join`而不是`os.path.join`.这通常不是你想要做的(特别是因为每个人的代码中都有一个名为`path`的变量). (2认同)
  • 此函数工作正常,但它不会将空文件夹添加到zip文件中,这在大多数情况下是预期的行为.换句话说,任何没有文件的子文件夹都将被忽略. (2认同)