明确需求(压缩成ZIP文件,文件中既有普通文件,又有文件夹)
1.通过某种方式获得一个文件(文件夹)列表作为一个list(例如wxpython的wx.FileDialog方法,在下面的代码中我们跳过文件夹列表的获取方法)。
2.选择一个压缩文件的输出目录和压缩文件的输出名字(下面代码中选择输出默认路径为程序根目录)
3.把文件list里的文件,先统一放在一个临时文件夹里,然后把该临时文件夹压缩成ZIP文件,最后删掉临时文件夹
程序关键点
1.使用python的shutil模块。拷贝文件和拷贝文件夹用的是不同的方法,在填写目标文件夹时,有很大区别,copytree()如果目标文件夹路径已存在,会导致拷贝失败,所以copytree()的目标文件夹路径,我设计成了目标目录+原文件夹名称的路径
#拷贝文件,该方法第二个参数填写的是目标目录 shutil.copy2(srcfile, folder_name)
#拷贝文件夹,该方法的第二个参数,是目标目录+原文件夹名称, #因为如果目标文件夹路径已存在会导致拷贝失败 last_name = os.path.basename(srcfile) destination_name = folder_name + last_name shutil.copytree(srcfile, destination_name)
2.打包文件夹和删除文件夹,使用shutil的make_archive()和rmtree()
shutil.make_archive(source, "zip", source) shutil.rmtree(source)
完整代码
运行测试时,请修改file的路径为你自己电脑里的文件路径
# -*- coding: UTF-8 -*- import os import shutil def copy_and_zip(file_list, dst_folder_name): ''' 批量复制文件到指定文件夹,然后把指定文件夹的内容压缩成ZIP并且删掉该文件夹 :param file_list: 文件或文件夹 :param dst_folder_name: 目标压缩文件的名称 :return: ''' for item in file_list: copy_file(item, dst_folder_name) # 这里我把输出文件的路径选到了程序根目录下 source = os.getcwd() + "\\" + dst_folder_name shutil.make_archive(source, "zip", source) shutil.rmtree(source) def copy_file(srcfile, filename): ''' 把文件或文件夹复制到指定目录中 :param srcfile: 文件或者文件夹的绝对路径 :param filename: 指定目录 :return: ''' dstfile = os.path.abspath(os.getcwd()) # 这里我把输出文件的路径选到了程序根目录下 folder_name = dstfile + "\\" + filename + "\\" if not os.path.isfile(srcfile): last_name = os.path.basename(srcfile) destination_name = folder_name + last_name shutil.copytree(srcfile, destination_name) print("copy %s -> %s" % (srcfile, destination_name)) else: fpath, fname = os.path.split(folder_name) # 分离文件名和路径 if not os.path.exists(fpath): os.makedirs(fpath) # 创建路径 shutil.copy2(srcfile, folder_name) # 移动文件 print("copy %s -> %s" % (srcfile, folder_name)) if __name__ == '__main__': file1 = "C:/Users/Pictures/1/1.jpg" file2 = "C:/Users/Pictures/1/sitemap.xml" file3 = "C:/lzw_programming/resource/" file_list = [file1, file2, file3] # 目标压缩包名 folder_name = "1234567" copy_and_zip(file_list, folder_name)