找回密码
  注册[Register]
查看: 553|回复: 10

[python] 微信文件自动分类整理

[复制链接]
发表于 2021-6-30 21:10 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。

一、需求和问题:
日积月累,微信接收的文件非常多非常乱,现要按照不同的发送人和不同的群分类整理文件,但是微信默认的是按月份分类整理,如下:
1.png
二、思路
虽然接收的文件夹没有按照不同发送人和群分类整理,但是微信客户端还是提供了筛选的功能,如下:
2.png
1、利用筛选功能获取所有的文件和该文件来源于哪个发送人或群的信息,信息以字典方式存储——{文件名称:文件来源};
2、根据存储的发送人和群的信息,即根据文件来源创建对应文件夹;
3、遍历微信接收文件夹中的所有文件,结合存储的数据,将文件拷贝到新创建的相应的文件夹中。
三、工具
1、电脑客户端自动化——pywinauto;
2、窗口控件信息获取——winspect。
四、具体代码


[Python] 纯文本查看 复制代码
from pywinauto import Desktop, Application
import pyautogui
import re
import os
import shutil
 
data_dic={}
folder_name=[]
file_name=[]
 
#启动微信
os.environ.update({"__COMPAT_LAYER":"RUnAsInvoker"})
app = Application(backend='uia').start(r'D:\Program Files (x86)\Tencent\WeChat\WeChat.exe')
 
#进入微信文件筛选界面
win_main_Dialog = Desktop(backend='uia').window(title='微信测试版')
wj=win_main_Dialog.window(title='微信文件')
wj.click_input()
win_main_Dialog = Desktop(backend='uia').window(title='微信文件')
wj2=win_main_Dialog.child_window(title='全部')
wj2.click_input()
 
#7条信息一个循环
def press_down():
    for i in range(7):
        pyautogui.press('down')
#读取数据函数   
def read_data():
    str_n='te'
    list_now=[]
    for i in range(1,8):
        #使用inspect探测元素定位,提取文件名
        fi_n=win_main_Dialog.children()[1].children()[2].children()[1].children()[1].children()[0].children()[0].children()[0].children()[0].children()[i].children()[0].children()[0].children()[1].children()[0].children()[0].children()[0].children()[0].window_text()
        #使用inspect探测元素定位,提取文件夹名,区分个人和群
        fo_n=win_main_Dialog.children()[1].children()[2].children()[1].children()[1].children()[0].children()[0].children()[0].children()[0].children()[i].children()[0].children()[0].children()[1].children()[0].children()[1].children()[0].window_text()
        if fo_n[-3:] == '的聊天':
            fo_n=re.findall('与(.*)的聊天',fo_n)[0]
        else:
            number=re.search(u"\|(.*?)",fo_n).span()[1]+1
            fo_n=fo_n[number:]
        file_name.append(fi_n.strip())
        folder_name.append(fo_n.strip())
        #无法统计接收文件数量,滚动条下拉到底即读取结束,判断依据为前后7条截取的部分信息一致
        list_now.append(fi_n.strip()[:2])
        str_n+=fi_n.strip()[:2]
    return list_now,str_n
 
#数据提取
for i in range(5):
    wj2.type_keys("{TAB}")#切换到文件信息页面
str_b=read_data()#读取第一页
press_down()#两次向下点击,进入第二页
press_down()#两次向下点击,进入第二页
pyautogui.press('down')
str_n=read_data()#读取第二页
press_down()#向下点击,进入第二页
#循环提取直到结束
while str_b!=str_n:
    str_b=str_n
    str_n=read_data()
    press_down()
 
#数据存储
for i in range(len(file_name)):
    if file_name[i] in data_dic:
        data_dic[file_name[i]]+=[folder_name[i]]
    else:
        data_dic[file_name[i]]=[folder_name[i]]
 
#根据提取的个人或群的文件夹名称,在迁移目的地文件夹创建对应文件夹,以便将相应文件存入
folder_path=r'd:/微信整理文件夹'
for i in set(folder_name):
    try:
        os.makedirs(os.path.join(folder_path,i))#创建分类文件夹
    except OSError:
        print(i)
         
#遍历所有微信接收文件,将文件拷贝到整理后的指定的文件夹中
for root,dirs,files in os.walk(r'D:\WeChat Files\wxid_mpxkxr21\FileStorage\File'):
    for file in files:
        old_path=os.path.join(root,file)#原始路径
        #文件名称调整,重复的文件,文件名后有多个'(1)'
        f_name=os.path.splitext(file)[0]
        f_name_s=os.path.splitext(file)[1]
        while f_name[-3:]=='(1)':
            f_name=f_name[0:-3]
             
        try:
            des_path_list=data_dic[f_name+f_name_s]
            for j in des_path_list:
                des_path=os.path.join(folder_path,j,file)#新的文件路径
                shutil.copyfile(old_path,des_path)
        except KeyError:
            print('对应文件不存在')
            print(os.path.join(root,file))
        except OSError:
            print('文件夹名称不符合规范')
            print(os.path.join(root,file))

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2021-6-30 21:43 | 显示全部楼层
6666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-6-30 21:44 | 显示全部楼层
感谢楼主分享!大牛有你更精彩!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-6-30 22:06 来自手机 | 显示全部楼层
感谢大佬分享,大佬666666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-6-30 22:30 | 显示全部楼层
多谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-6-30 22:31 | 显示全部楼层
谢谢分享!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-7-1 00:52 | 显示全部楼层

支持楼主,谢谢分享。
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-7-1 09:44 | 显示全部楼层
必须支持,谢谢大佬的额分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-7-1 10:10 | 显示全部楼层

感谢楼主分享!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-7-1 10:10 | 显示全部楼层
感谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|广告投放|大牛论坛

GMT+8, 2024-5-14 03:32 , Processed in 0.048241 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表