批量清理重复电子书:保留epub/kepub,无重复则保留原文件
解决电子书格式筛选问题:仅在重复书名时保留epub/kepub
问题说明
从Telegram下载了大量多格式电子书,需要实现以下逻辑:
- 同一书名存在多格式副本时,仅保留epub或kepub格式文件
- 若无重复副本,保留原格式(如PDF、MOBI等)
原代码会直接删除所有非epub/kepub文件,不符合需求,以下是修正后的实现代码。
修正后的Python代码
import os from collections import defaultdict def filter_ebooks(root_dir): # 按书名(去掉后缀)分组存储文件路径 book_groups = defaultdict(list) target_extensions = ('.epub', '.kepub.epub') # 可根据实际kepub后缀调整 # 遍历目录收集所有电子书文件 for dirpath, _, filenames in os.walk(root_dir): for filename in filenames: file_path = os.path.join(dirpath, filename) if not os.path.isfile(file_path): continue # 提取不带扩展名的书名 book_name = os.path.splitext(filename)[0] book_groups[book_name].append(file_path) # 处理每个书名分组 for book_name, files in book_groups.items(): # 检查当前分组是否有目标格式文件 has_target = any(file.lower().endswith(target_extensions) for file in files) if has_target: # 有目标格式,删除非目标格式文件 for file in files: if not file.lower().endswith(target_extensions): try: os.remove(file) print(f"已删除: {file}") except Exception as e: print(f"删除失败 {file}: {str(e)}") else: # 无目标格式,保留所有文件 print(f"无epub/kepub副本,保留: {book_name}") if __name__ == "__main__": # 替换为你的电子书目录路径 ebook_dir = "./your_ebook_folder" filter_ebooks(ebook_dir)
代码关键逻辑说明
- 按书名分组:用
defaultdict将同一书名的不同格式文件归为一组,核心是通过os.path.splitext提取不带后缀的书名 - 目标格式匹配:默认兼容
.epub和.kepub.epub后缀,若你的kepub是其他后缀(比如.kepub),直接修改target_extensions元组即可 - 条件删除逻辑:
- 组内存在目标格式时,仅保留epub/kepub,删除其他格式
- 组内无目标格式时,不做任何删除操作,保留原格式文件
- 异常防护:增加文件删除的异常捕获,避免因权限、文件占用等问题导致程序崩溃
内容的提问来源于stack exchange,提问作者jcsantos
相关产品推荐
相关产品推荐

