基于 Python 的删除图片脚本

下面提供一个基于 Python 的脚本示例,支持在指定文件夹中根据用户输入的关键字批量删除图片文件。脚本要点如下:

  • 使用 argparse 获取命令行参数:目标文件夹路径、匹配关键字、可选的匹配模式(简单子串或相似度阈值)。
  • 遍历文件夹下所有常见图片格式(如 .jpg/.jpeg/.png/.gif/.bmp),对每个文件名进行模糊匹配。
  • 匹配方式可选:
    1. 子串匹配:文件名中包含关键字即视为匹配。
    2. 相似度匹配:使用 difflib.SequenceMatcher 计算文件名与关键字的相似度,超过阈值即删除。
  • 删除前可打印确认列表,或加 --yes 参数跳过确认直接删除。

脚本实现

#!/usr/bin/env python3
# delete_images.py

import os
import argparse
import fnmatch
import shutil
from difflib import SequenceMatcher

def is_fuzzy_match(name: str, keyword: str, mode: str, threshold: float) -> bool:
    """判断文件名与关键字是否“模糊匹配”。"""
    name_lower = name.lower()
    kw_lower = keyword.lower()

    if mode == 'substring':
        return kw_lower in name_lower
    elif mode == 'ratio':
        ratio = SequenceMatcher(None, name_lower, kw_lower).ratio()
        return ratio >= threshold
    else:
        raise ValueError(f"Unknown mode: {mode}")

def gather_images(folder: str, exts=None):
    """收集指定后缀的所有图片文件路径。"""
    if exts is None:
        exts = ['*.jpg', '*.jpeg', '*.png', '*.gif', '*.bmp']
    for root, _, files in os.walk(folder):
        for pattern in exts:
            for fn in fnmatch.filter(files, pattern):
                yield os.path.join(root, fn)

def main():
    parser = argparse.ArgumentParser(
        description="根据关键字(模糊匹配)批量删除指定文件夹内的图片"
    )
    parser.add_argument(
        '-f', '--folder', required=True,
        help="目标图片文件夹路径"
    )
    parser.add_argument(
        '-k', '--keyword', required=True,
        help="用于匹配文件名的关键字"
    )
    parser.add_argument(
        '-m', '--mode', choices=['substring', 'ratio'],
        default='substring',
        help="匹配模式:'substring'(默认)或 'ratio'(相似度)"
    )
    parser.add_argument(
        '-t', '--threshold', type=float, default=0.6,
        help="相似度匹配阈值,仅在 mode='ratio' 时生效(0~1 之间)"
    )
    parser.add_argument(
        '-y', '--yes', action='store_true',
        help="跳过确认,直接删除匹配到的文件"
    )
    args = parser.parse_args()

    folder = args.folder
    keyword = args.keyword
    mode = args.mode
    threshold = args.threshold
    auto_yes = args.yes

    # 收集待处理图片
    imgs = list(gather_images(folder))
    matches = [p for p in imgs
               if is_fuzzy_match(os.path.basename(p), keyword, mode, threshold)]

    if not matches:
        print(f"未在 {folder} 中找到与 “{keyword}” 匹配的图片。")
        return

    # 列出并确认
    print("以下文件将被删除:")
    for p in matches:
        print("  ", p)
    if not auto_yes:
        confirm = input("确定要删除以上文件吗?输入 'yes' 确认:")
        if confirm.lower() != 'yes':
            print("已取消。")
            return

    # 执行删除
    for p in matches:
        try:
            os.remove(p)
        except Exception as e:
            print(f"删除失败:{p},原因:{e}")
    print("删除完成。")

if __name__ == "__main__":
    main()

使用示例

# 在 /home/user/photos 中删除文件名包含 “vacation” 的图片(子串匹配)
python delete_images.py -f /home/user/photos -k vacation

# 使用相似度匹配,阈值 0.7,并自动确认删除
python delete_images.py -f ./images -k "vacaion" -m ratio -t 0.7 -y

注意事项

  1. 务必先做测试:建议先在一个副本文件夹中测试,确保匹配逻辑符合预期,以免误删。
  2. 备份重要图片:如有重要照片,务必提前备份。
  3. 如果想排除子文件夹,可将 gather_images 中的 os.walk 改为只扫描顶层目录。
posted @ 2025-04-24 16:06  ZHZCE  阅读(121)  评论(0)    收藏  举报