微信电脑文件清理python程序

import os,re
from itertools import combinations

#两两组合
def combinations_iterative(elements):
    return list(combinations(elements, 2))

#将按照字符串长度升序排列
def sort_by_length(lst):
    # 定义一个自定义排序函数,按字符串长度排序
    def length_sort(item):
        return len(item)

    # 使用 sorted 函数对列表进行排序,按照字符串长度升序排列
    return sorted(lst, key=length_sort)

#第一轮遍历文件
def build_file_dict(folder_path):
    file_dict = {}

    # 遍历文件夹中的所有文件
    for root, dirs, files in os.walk(folder_path):
        for file_name in files:
            # 获取文件的完整路径
            file_path = os.path.join(root, file_name)
            # 获取文件的体积
            file_size = os.path.getsize(file_path)//1024

            # 获取文件的基础名和扩展名
            base_name, extension = os.path.splitext(file_name)

            # 如果文件体积已经在字典中
            if file_size in file_dict:
                # 如果文件扩展名已经在内部字典中
                if extension in file_dict[file_size]:
                    # 将文件基础名添加到对应的列表中
                    file_dict[file_size][extension].append(base_name)
                else:
                    # 创建新的扩展名列表,并添加基础名
                    file_dict[file_size][extension] = [base_name]
            else:
                # 创建新的内部字典,并添加扩展名和基础名
                file_dict[file_size] = {extension: [base_name]}

    return file_dict

# 查找重复的文件 并删除
def find_duplicate_files(file_dict):
    for k,v in file_dict.items():
        for k2,v2 in v.items():

            duplicate_files=set() #疑似重复
            existing_files=set() 

            result=combinations_iterative(v2) #两两组合
            for comp in result:
                temp=sort_by_length(comp)
                if len(temp[0])!=len(temp[1]):
                    match = re.match(r'(.*)\((\d+)\)', temp[1])
                    if match:
                        if match.group(1)==temp[0]:
                            duplicate_files.add(temp[1])
                            existing_files.add(temp[0])
            if len(duplicate_files)>0:
                print(existing_files)
                print(duplicate_files)
                for dd in duplicate_files:
                    file_path=os.path.join(folder_path, dd+k2)
                    
                    # 获取当前权限
                    current_permissions = os.stat(file_path).st_mode
                    # 移除只读权限
                    os.chmod(file_path, current_permissions | 0o222)
                    print(f"删除副本文件:{file_path}")
                    os.remove(file_path)
                print('-'*5)
# 遍历所有的子文件夹
def find_direct_subdirectories(folder):
    subdirectories = []
    # 使用 os.listdir() 函数获取文件夹下的所有项
    items = os.listdir(folder)
    # 遍历每个项,筛选出子文件夹
    for item in items:
        item_path = os.path.join(folder, item)
        if os.path.isdir(item_path):
            subdirectories.append(item_path)
    return subdirectories

folder_patha = r"F:\微信文件备份\WeChat Files\kcjevin\FileStorage\File"
subdirs = find_direct_subdirectories(folder_patha)
print("直接子文件夹列表:")
for subdir in subdirs:
    print(subdir)
    folder_path = subdir  # 替换为你的文件夹路径
    file_dict = build_file_dict(folder_path)
    # print(file_dict)
    find_duplicate_files(file_dict)

posted on 2024-05-10 10:21  耀扬  阅读(15)  评论(0编辑  收藏  举报

导航