不使用python zipfile产生嵌套文件夹内的文件

问题描述

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

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

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

我的文件夹是D:/个人。 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个嵌套文件夹中的文件。请告知我该怎么办?

非常感谢。

解决方法

使用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()