2010-08-31 75 views
8

可能重复:
How do I zip the contents of a folder using python (version 2.5)?更好的方式来压缩Python中的文件(使用单个命令压缩整个目录)?

假设我有一个目录:/home/user/files/。这个目录有一堆文件:

/home/user/files/ 
    -- test.py 
    -- config.py 

我想使用Python中ZipFile这个目录压缩。我需要loop through the directory and add these files recursively,还是可以通过目录名称和ZipFile类自动添加它下面的所有内容?

最后,我想有:

/home/user/files.zip (and inside my zip, I dont need to have a /files folder inside the zip:) 
    -- test.py 
    -- config.py 
+2

由于os.walk产生的目录的全部内容 - 做递归你 - 这似乎是一个微不足道的循环。你想优化什么?代码行?我不知道如何。时间?不可能 - Zip需要时间。你有什么问题? – 2010-08-31 18:56:50

+0

我只想压缩一个可能有空文件夹的文件夹,而无需为Linux机器使用zip实用程序和子流程模块的单个命令执行的操作编写大量代码行。 – 2010-09-01 17:39:23

回答

1

你可以使用subprocess模块:

import subprocess 

PIPE = subprocess.PIPE 
pd = subprocess.Popen(['/usr/bin/zip', '-r', 'files', 'files'], 
         stdout=PIPE, stderr=PIPE) 
stdout, stderr = pd.communicate() 

的代码没有进行测试,装作刚UNIX机器上工作,我不知道如果Windows也有类似的命令行工具。

+0

我已经在脚本的另一部分使用了子进程,这就是我一直在寻找的!我没有考虑从* nixes机器使用zip,谢谢! – 2010-09-01 17:36:37

6

你可以尝试使用的distutils包:

distutils.archive_util.make_zipfile(base_name, base_dir[, verbose=0, dry_run=0]) 
23

请注意,这不包括空目录。如果需要这些,则可以在网上找到解决方法。可能最好在我们最喜欢的归档程序中为空目录获取ZipInfo记录来查看它们中的内容。

硬编码的文件/路径摆脱我的代码细节的...

target_dir = '/tmp/zip_me_up' 
zip = zipfile.ZipFile('/tmp/example.zip', 'w', zipfile.ZIP_DEFLATED) 
rootlen = len(target_dir) + 1 
for base, dirs, files in os.walk(target_dir): 
    for file in files: 
     fn = os.path.join(base, file) 
     zip.write(fn, fn[rootlen:])