首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Python创建.zip?

用Python创建.zip?
EN

Stack Overflow用户
提问于 2013-01-28 18:27:40
回答 2查看 54K关注 0票数 37

我试图在脚本中创建一个函数,将给定源目录(src)的内容压缩到zip文件(dst)。例如,zip('/path/to/dir', '/path/to/file.zip'),其中/path/to/dir是一个目录,而/path/to/file.zip还不存在。我不想压缩目录本身,这在我的情况下是完全不同的。我希望压缩目录中的文件(和subdirs)。这就是我想要的:

代码语言:javascript
运行
复制
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()

这就创建了一个本质上是/的zip。例如,如果我压缩/path/to/dir,则解压缩zip将创建一个目录,其中包含"path“,目录中有"to”,等等。

有没有人有一个不引起这个问题的函数?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-28 18:50:17

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

您可以使用它在开始时去掉通往src的路径。在这里,我使用os.path.abspath()确保srcos.walk()返回的文件名都有一个共同的前缀。

代码语言:javascript
运行
复制
#!/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")

具有如下目录结构:

代码语言:javascript
运行
复制
src
└── a
    ├── b
    │   └── bar
    └── foo

脚本打印:

代码语言:javascript
运行
复制
zipping src/a/foo as a/foo
zipping src/a/b/bar as a/b/bar

生成的zip文件的内容如下:

代码语言:javascript
运行
复制
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
票数 57
EN

Stack Overflow用户

发布于 2013-01-28 18:38:37

据我所知你已经很接近了。您可以使用dirnamebasename来确保您正在获取正确的路径名:

代码语言:javascript
运行
复制
>>> os.path.dirname("/path/to/dst")
'/path/to'
>>> os.path.basename("/path/to/dst")
'dst'

然后,使用chdir,您可以确保您在父级中,因此路径是相对的。

代码语言:javascript
运行
复制
def zip(src, dst):
    parent = os.path.dirname(dst)
    folder = os.path.basename(dst)

    os.chdir(parent):
    for dirname, subdirs, filenames in os.walk(folder):
        ...

这就产生了:

代码语言:javascript
运行
复制
dst/a.txt
dst/b
dst/b/c.txt
...etc...

如果不想包含名称"dst“,可以只执行os.chdir(dst),然后执行os.walk('.')

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14568647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档