对某网站的批量解压(需要把同一类压缩包统一命名)

发布时间 2023-12-26 14:38:44作者: 不上火星不改名
在每次运行程序前,要求用户输入一个"目标目录"。
“目标目录”下里有很多压缩包(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()