【问题标题】:Not yielding files inside nested folders using python zipfile不使用 python zipfile 在嵌套文件夹中生成文件
【发布时间】:2020-09-12 21:30:08
【问题描述】:

已解决,检查标记的答案 似乎标有 os.walk() 的执行速度更快。

(Python 3.8,zipfile 模块,Windows 10 Anaconda)

我正在使用 python 的 zipfile 模块来创建我的文件夹的 Zip 文件。

我的文件夹是 D:/Personals。 os.listdir 的交友会产生 2 个文件夹和 171 个文件。 当我检查 zip 时,它包含文件夹的所有 171 个文件和 2 个内部嵌套文件夹。但是内部嵌套的文件夹是空的,尽管每个文件夹都包含许多单独的文件。这是我的代码。

from zipfile import ZipFile 
from os import listdir 

dir_path = 'D:/Personals'
export_path = 'D:/Zipper'

items_list = listdir(dir_path)
zipper = ZipFile(export_path+'/S1.zip','w')

for item in items_list:
    zipper.write(dir_path+'/'+item)

zipper.close()

它已生成文件夹内的所有文件,但未能返回 2 个嵌套文件夹内的文件。请告知我该怎么办?

非常感谢。

【问题讨论】:

    标签: python windows zipfile


    【解决方案1】:

    使用 ZipFile 模块压缩文件夹时,必须使用递归来包含子文件夹。

    试试这个代码:

    from zipfile import ZipFile 
    from os import listdir, path
    
    dir_path = 'D:/Personals'  # root folder to zip
    export_path = 'D:/Zipper'  # target folder for zip file
    
    items_list = listdir(dir_path)
    zipper = ZipFile(export_path+'/S1.zip','w')
    
    def addzipitems(zipper, folder):  # single folder
        for item in listdir(folder):  # each item (file or folder)
            zipper.write(folder+'/'+item)  # add item to zip (for folder, will add empty)
            if path.isdir(folder +'/'+item):  # if item is subfolder
                addzipitems(zipper, folder +'/'+item)   # process subfolder
    
    addzipitems(zipper, dir_path)  # start at root folder
    zipper.close()
    

    您也可以使用os.walk 来获取目录树中的所有文件。不需要递归。

    from zipfile import ZipFile 
    from os import listdir, path, walk
    
    dir_path = 'D:/Personals'  # root folder to zip
    export_path = 'D:/Zipper'  # target folder for zip file
    
    zipper = ZipFile(export_path+'/S1.zip','w')
    
    for path, directories, files in walk(dir_path): # all folders\files in tree
        for f in files:  # files is list
            zipper.write(path+'/'+f)
    
    zipper.close()
    

    【讨论】:

    • 我在多个文件夹中尝试了这两个功能。从时间的角度来看, os.walk 比递归更快。在我看来这是一个更好的?
    猜你喜欢
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多