从目标目录开始压缩文件和目录

时间:2015-02-01 02:39:09

标签: python directory zip

我的脚本的工作目录如下所示:

my_script.py
random/
      |_ system/
                |_ folder/
                |         |_ fileA
                |_ fileB
                |_ fileC

我想压缩system及其所有子目录和文件,以便最终结果如下所示:

output.zip
          |_system/
                   |_ folder/
                   |        |_ fileA
                   |_ fileB
                   |_ fileC

我的解决方案(下面)的问题是它在输出zip中包含目录random。换句话说,生成的zip树的起始位置为my_script.py

target = 'random/system'

zip_file = zipfile.ZipFile('output.zip', mode='w')

for root, dirs, files in os.walk(target):
    zip_file.write(root)
    for file in files:
        zip_file.write(root + '/' + file)

zip_file.close()

这是我的代码的(有缺陷的)输出:

output.zip
          |_random/
                   |_system/
                            |_ folder/
                            |        |_ fileA
                            |_ fileB
                            |_ fileC

无需移动任何目录/文件,如何获得所需的输出?如何在脚本和目标目录之间排除目录?

1 个答案:

答案 0 :(得分:0)

这是一个改变工作目录的简单方法。调用脚本时,请确保其中有os.chdir()语句。然后,当您执行os.walk()时,您正在传递system而不是传递random/system。以下应该有效:

import os
import zipfile

os.chdir('random')
target = 'system'

zip_file = zipfile.ZipFile('../output.zip', mode='w')

for root, dirs, files in os.walk(target):
    zip_file.write(root)
    for file in files:
        zip_file.write(root + '/' + file)

zip_file.close()

作为一种风格问题,您应该在with内执行文件I / O,如下所示:

with zipfile.ZipFile('../output.zip', mode='w') as zip_file:
    for root, dirs, files in os.walk(target):
        zip_file.write(root)
        for file in files:
            zip_file.write(root + '/' + file)