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)
| 归档时间: |
|
| 查看次数: |
47667 次 |
| 最近记录: |