【问题标题】:Zip files and directories starting from a target directory从目标目录开始压缩文件和目录
【发布时间】:2015-02-01 02:39:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: python directory zip


    【解决方案1】:

    这是更改工作目录的简单问题。调用脚本时,请确保其中有 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)
    

    【讨论】:

      猜你喜欢
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多