在每次运行程序前,要求用户输入一个"目标目录"。 “目标目录”下里有很多压缩包(zip),压缩包的名称大概是:袋装狗粮 (1).zip, 袋装狗粮 (2).zip, 袋装狗粮 (3).zip, 袋装狗粮 (4).zip,猫罐头 (1).zip,猫罐头 (2).zip,英式早餐.zip 等。 这些压缩包里装了很多图片。 这里"袋装狗粮"视为一类,"猫罐头"视为一类,“英式早餐”视为一类。(忽略数字后缀以及文件扩展名,前面的名称相同的可视为一类。)(“袋装狗粮”,“猫罐头”以及“英式早餐”这里为类名称) 每检测到一类,则在“目标目录”下建立一个新的文件夹,文件夹命名为该类名称,(如袋装狗粮),如果已经存在该类名称的文件夹,则跳过。 将相同类的压缩包的统一解压到该类的文件夹中,如果解压过程中发现有重复图片文件,则跳过该图片。 程序结束后,遍历“目标目录”下所有的文件夹类型(考虑文件夹嵌套),删除其下面所有空的子文件夹。
import os import zipfile from pathlib import Path def is_image(file_name): # 检查文件是否为图片 return file_name.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')) def remove_empty_folders(path): # 递归删除空文件夹 if not path.is_dir(): return # 如果文件夹为空,则删除它 if not any(Path(path).iterdir()): path.rmdir() print(f"删除空文件夹: {path}") return # 否则递归检查其子文件夹 for subpath in Path(path).iterdir(): if subpath.is_dir(): remove_empty_folders(subpath) def main(): # 请求用户输入目标目录 target_dir = input("请输入目标目录: ") # 确保目标目录存在 if not os.path.exists(target_dir): print("指定的目录不存在,请检查后重试。") return # 找到所有.zip文件 zip_files = [f for f in Path(target_dir).glob('**/*.zip')] # 分类并处理每个.zip文件 for zip_file in zip_files: # 从文件名提取类名(忽略数字和文件扩展名) category_name = ''.join(filter(str.isalpha, zip_file.stem)) # 创建类别目录(如果尚不存在) category_dir = Path(target_dir) / category_name category_dir.mkdir(exist_ok=True) # 解压文件到类别目录,只解压图片文件 with zipfile.ZipFile(zip_file, 'r') as zip_ref: for file in zip_ref.namelist(): if is_image(file) and Path(file).parent != Path('.'): file_path = category_dir / Path(file).name # 只获取图片文件名,不包括其原始子文件夹路径 if not file_path.exists(): zip_ref.extract(file, category_dir) # 如果原文件在子文件夹中,移动到类别目录 os.rename(category_dir / file, file_path) else: print(f"跳过已存在的文件: {file_path}") # 删除所有空的文件夹 remove_empty_folders(Path(target_dir)) if __name__ == "__main__": main()
标签:解压,批量,zip,文件夹,dir,file,Path,path,压缩包 From: https://www.cnblogs.com/zly324/p/17928077.html