python-批量把文件和文件夹同时压缩成ZIP文件
-
明确需求(压缩成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)