【Python】解决最新电脑版微信[22-06]聊天文件统一按用户归类到MsgAttach文件夹的问题

【Python】解决最新电脑版微信[22-06]聊天文件统一按用户归类到MsgAttach文件夹的问题

  • 背景
  • 前提
  • 代码
  • 版本1
  • 版本2
  • 背景

    最近,微信又更新了,但这一版本的聊天文件安排方式变化有点大,
    之前是按月份分类统一放到File文件夹下

    “WeChat Files\wxid_XXXXXXXXXXXXXX\FileStorage\File”

    目前是按聊天用户分类统一放到MsgAttach文件夹下

    “WeChat Files\wxid_XXXXXXXXXXXXXX\FileStorage\MsgAttach”

    对于一个极度喜欢整理文件夹的ISTJer来说,短时间呢必然是不能接受这样的改变的,
    于是自己动手,丰衣足食,用几行Python代码来解决此问题。

    前提

    python os、shutil 模块
    技巧 list.extend() dict.get()

    代码

    版本1

    该文件将 MsgAttach目录下的目录过滤后按月份分类复制到File_X目录下,使用时需要自行修改原目录和目标目录中的wxid

    import os
    import shutil
    # from utils import mkdir
    
    def mkdir(path):
        if not os.path.exists(path):
            os.makedirs(path)
            print("mkdir at {}".format(path))
        return path
    
    def get_sub_path(path):
        path_list = ["{}\\{}".format(path, _) for _ in os.listdir(path)]
        return path_list
    
    copy_path = "D:\\Documents\\WeChat Files\\wxid_XXXXXXXXXXXXXX\FileStorage\\File_X"  #需修改wxid_XXXXXXXXXXXXXX
    meat_path = "D:\\Documents\\WeChat Files\\wxid_XXXXXXXXXXXXXX\FileStorage\\MsgAttach"  #需修改wxid_XXXXXXXXXXXXXX
    path_list = get_sub_path(meat_path)
    final_path_list = []
    final_path_list.extend(["{}\\File".format(path) for path in path_list if "File" in os.listdir(path)])  # 过滤
    # print(final_path_list)
    
    month_path_list = []
    for path in final_path_list:
        month_path_list.extend(get_sub_path(path))
    # print(month_path_list)
    
    month_path_dict = {}
    for path in month_path_list:
        key = path[-7:]
        # print(month_path_dict[key])
        if not month_path_dict.get(key):
            month_path_dict[key] = []
        month_path_dict[key].append(path)
    # print(month_path_dict)
    
    #  按月份复制
    for month, path_list in month_path_dict.items():
        file_list = []
        for path in path_list:
            file_list.extend(get_sub_path(path))
    
        new_path = mkdir("{}\\{}".format(copy_path, month))
        for file_path in file_list:
            file_name = file_path.split("\\")[-1]
            new_file_path = "{}\{}".format(new_path, file_name)
            try:
                shutil.copy(file_path, new_path)
                print("copy {} from {} to {}".format(file_name, file_path, new_path))
            except Exception as e:
                print(e)
        print()
    

    版本2

    该文件将 MsgAttach目录下的文件过滤后按统一复制到File_All目录下,使用时需要自行修改原目录和目标目录中的wxid

    import os
    import shutil
    # from utils import mkdir
    
    def mkdir(path):
        if not os.path.exists(path):
            os.makedirs(path)
            print("mkdir at {}".format(path))
        return path
    
    def get_sub_path(path):
        path_list = ["{}\\{}".format(path, _) for _ in os.listdir(path)]
        return path_list
    
    copy_path = "D:\\Documents\\WeChat Files\\wxid_XXXXXXXXXXXXXX\FileStorage\\File"  #需修改wxid_XXXXXXXXXXXXXX
    meat_path = "D:\\Documents\\WeChat Files\\wxid_XXXXXXXXXXXXXX\FileStorage\\MsgAttach"  #需修改wxid_XXXXXXXXXXXXXX
    path_list = get_sub_path(meat_path)
    final_path_list = []
    final_path_list.extend(["{}\\File".format(path) for path in path_list if "File" in os.listdir(path)])
    # print(final_path_list)
    
    copy_path = mkdir("{}_all\\".format(copy_path))
    for path in final_path_list:
        if os.path.exists(path):
            # root 所指的是当前正在遍历的这个文件夹的本身的地址
            # dirs 是一个 list,内容是该文件夹中所有的目录的名字(不包括子目录)
            # files 同样是 list, 内容是该文件夹中所有的文件(不包括子目录)
            for root, dirs, files in os.walk(path):
                for file in files:
                    src_file = os.path.join(root, file)
                    shutil.copy(src_file, copy_path)
                    print(file)
                    # print("copy {} from {} to {}".format(file, src_file, copy_path))
    

    版本2 部分代码 参考 Python-文件夹的拷贝操作

    来源:AI使徒

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python】解决最新电脑版微信[22-06]聊天文件统一按用户归类到MsgAttach文件夹的问题

    发表评论