【问题标题】:How to recursively zip multiple folders as individual .zip files?如何递归地将多个文件夹压缩为单独的 .zip 文件?
【发布时间】:2017-10-08 10:53:32
【问题描述】:

我有一组文件夹(名为 *.pages),我想将它们压缩到它们各自的 .zip 文件中,例如“example1.pages”到“example1.pages.zip”,“example2.pages”到“example2.pages.zip”等。我还想包含各个.pages文件夹的内容。

目前,该脚本将所有 .pages 文件压缩到具有嵌套目录的单个文件中。

我不确定如何继续,并且我相信我在执行 zipfile 函数时遗漏了一些东西。

任何帮助将不胜感激!

import os
import zipfile

start_path = "MY/DIRECTORY/HERE"

def zipdir(ziph):
    dir_count = 0
    file_count = 0
    for (path,dirs,files) in os.walk(start_path):
        print('Directory: {:s}'.format(path))
        dir_count += 1

        for file in dirs:
            if file.endswith(".pages"): 
                print('\nAttempting to zip: \'{}\''.format(file))

                ziph.write(os.path.join(path, file))

                print('Done')
                file_count += 1

    print('\nProcessed {} files in {} directories.'.format(file_count,dir_count))    



if __name__ == '__main__':
    zipf = zipfile.ZipFile("NAME/OF/INDIVIDUAL/ZIP/FILE.zip", 'w', zipfile.ZIP_DEFLATED)
    zipdir(zipf)
    zipf.close()

【问题讨论】:

  • 如果你想对文件进行操作,你为什么要遍历 dirs?
  • 如果你想要多个 zip 文件...然后在循环中创建它们。
  • @pvg 我想对名为“.pages”的文件夹进行操作

标签: python recursion directory zipfile


【解决方案1】:

您只需打开一个 zip 文件并在其中添加所有内容。如果您希望每个文件一个 zip,则需要在扫描文件时在循环中创建 zip 文件。

import os
import zipfile

start_path = "MY/DIRECTORY/HERE"
start_path = '.'

def zipdir(start_path):
    dir_count = 0
    file_count = 0
    for (path,dirs,files) in os.walk(start_path):
        print('Directory: {:s}'.format(path))
        dir_count += 1
        for file in files:
            if file.endswith(".pages"): 
                file_path = os.path.join(path, file)
                print('\nAttempting to zip: \'{}\''.format(file_path))
                with zipfile.ZipFile(file_path + '.zip', 'w', zipfile.ZIP_DEFLATED) as ziph:
                    ziph.write(file_path, file)
                print('Done')
                file_count += 1

    print('\nProcessed {} files in {} directories.'.format(file_count,dir_count))

if __name__ == '__main__':
    zipdir(start_path)

【讨论】:

    【解决方案2】:

    你也可以采用@tdelaney的代码,使用shutil模块如下:

    enter import os
    import shutil
    
    reports_path  = os.getcwd()
    
    def zipdir(reports_path):
    for (path,dirs,files) in os.walk(reports_path):
    
        for d in dirs:
            file_path = os.path.join(path, d)
            print 'Compressing ' + d  
            shutil.make_archive(d,'zip',file_path)
            print "Done"
    
    if __name__ == '__main__':
        zipdir(reports_path)
    

    【讨论】:

      猜你喜欢
      • 2016-12-17
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多