import os
from glob import glob
import logging
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def get_filename_without_ext(filepath):
"""提取文件名(不包含路径和后缀)并转换为小写"""
return os.path.splitext(os.path.basename(filepath))[0].lower()
def depth_first_search(path, filenames_set):
"""递归遍历文件夹,收集文件名(不包含路径和后缀)"""
for item in os.listdir(path):
full_path = os.path.join(path, item)
if os.path.isdir(full_path):
depth_first_search(full_path, filenames_set)
else:
filenames_set.add(get_filename_without_ext(full_path))
def delete_duplicate_files(path, filenames_to_delete):
"""递归遍历文件夹,删除与指定文件名集合匹配的文件"""
for item in os.listdir(path):
full_path = os.path.join(path, item)
if os.path.isdir(full_path):
delete_duplicate_files(full_path, filenames_to_delete)
else:
name_without_ext = get_filename_without_ext(full_path)
if name_without_ext in filenames_to_delete:
try:
os.remove(full_path)
logging.info(f"Deleted: {full_path}")
filenames_to_delete.remove(name_without_ext)
except Exception as e:
logging.error(f"Failed to delete {full_path}: {e}")
def main():
# 指定文件夹路径
folder1 = os.path.abspath(r'E:\2') # 文件夹1,将被检查并删除重名文件
folder2 = os.path.abspath(r'E:\1') # 文件夹2,用于比较文件名
# 使用DFS收集文件夹2中所有文件的文件名(去除后缀)
filenames2 = set()
depth_first_search(folder2, filenames2)
# 执行删除操作
delete_duplicate_files(folder1, filenames2)
logging.info("Removal process completed.")
if __name__ == "__main__":
main()
python 从文件夹1中删除与文件夹2中重名的文件(基于文件名,忽略后缀和大小写)即保留1文件夹中与2文件夹不重名的文件
于 2025-02-20 14:19:35 首次发布