我试图在脚本中创建一个函数,将给定源目录(src)的内容压缩到zip文件(dst)。例如,zip('/path/to/dir', '/path/to/file.zip'),其中/path/to/dir是一个目录,而/path/to/file.zip还不存在。我不想压缩目录本身,这在我的情况下是完全不同的。我希望压缩目录中的文件(和subdirs)。这就是我想要的:
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”,等等。
有没有人有一个不引起这个问题的函数?
我不能强调这一点,需要来压缩目录中的文件,而不是目录本身。
发布于 2013-01-28 18:38:37
据我所知你已经很接近了。您可以使用dirname和basename来确保您正在获取正确的路径名:
>>> os.path.dirname("/path/to/dst")
'/path/to'
>>> os.path.basename("/path/to/dst")
'dst'然后,使用chdir,您可以确保您在父级中,因此路径是相对的。
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):
...这就产生了:
dst/a.txt
dst/b
dst/b/c.txt
...etc...如果不想包含名称"dst“,可以只执行os.chdir(dst),然后执行os.walk('.')。
希望这能有所帮助。
https://stackoverflow.com/questions/14568647
复制相似问题