【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 mkdirdef mkdir(path):if not os.path.exists(path):os.makedirs(path)print("mkdir at {}".format(path))return pathdef get_sub_path(path):path_list = ["{}\\{}".format(path, _) for _ in os.listdir(path)]return path_listcopy_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 mkdirdef mkdir(path):if not os.path.exists(path):os.makedirs(path)print("mkdir at {}".format(path))return pathdef get_sub_path(path):path_list = ["{}\\{}".format(path, _) for _ in os.listdir(path)]return path_listcopy_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-文件夹的拷贝操作