大家都知道安卓系统用久了之后会变得不太流畅,给人一种系统长胖了的感觉,总想给他瘦瘦身。刚好我本人使用的是华为P10 Plus,故写了以下代码。该代码通过正则表达式的规则在指定的目录下扫描文件,最后匹配出自定义文件名的文件,然后复制(不是剪切)到指定的目录。代码如下,若有不合理之处请大家多多指点,谢谢。
import os
import re
import shutil
"""
使用方法:
在主函数中输入以下内容,则会在目标文件夹中根据自定义关键字匹配出匹配文件,并复制到指定文件夹(注意使用r元字符)
your_scan_path = r'D:/' #输入需要扫描的驱动器或者分区,默认扫描D盘
your_re_filter = r'.*.pptx' #输入需要匹配的文件规则,正则表达式规则
your_store_path = r'D:\TEMP\copy/' #输入存放文件的目的文件夹
"""
def file_scanner(your_path,your_re_filter):
global file_name #声明全局变量,后面函数要调用
file_collect = [] # 存放扫描到的文件的完整路径
repeat_files = [] #存放扫描到的文件中的重复文件名
file_name=[] #存放扫描到的文件名
#遍历目的文件夹,判断文件符合正则表达式内容,则将文件路径记录并放入file_collect列表
for root,fold,files in (os.walk(your_path)): #通过os.walk实现遍历
while len(files): #通过while实现循环,判断files列表中是否还有元素
x = files.pop() #不停的重文件列表中弹出一个文件名用于后续判断,直到弹出结束为止
if re.match(your_re_filter, x, re.I): #判断文件是否匹配
file_name.append(x) #记录匹配文件的文件名
file_collect.append(root+'/'+x) #将匹配的文件拼接为完整路径,并放入file_collect列表
#计算上述匹配到的文件中是否存在重复文件,如果存在则计算总共重复多少份,并根据用户输入,判断是否打印
repeat_P3 = set(file_name) #将记录文件名的列表集合化,去重
repeat_files_count = len(file_name) - len(repeat_P3) #将未去重的列表内元素数量减去去重后剩下的元素数量等于重复份数
print('Match %d files, %d files Redundant\n' %(len(file_collect),repeat_files_count)) #打印
#根据用户输入Y or N判断是否打印重复文件的名称,记住是名称,不是路径
if repeat_files_count: #如果存在重复文件则进行后续步骤
user_input01 = input('Check Redundant Files?(Y/N): ') #1. 让用户输入Y or N
if user_input01 == 'Y': #2. 如果输入的是Y 则进行后续步骤
print('\n========Redundant file name========')
for repeat_p1 in repeat_P3: #3. 通过for 循环遍历去重复后的集合序列。将集合中的元素在file_name列表中去计数,看是否为1,如果不为1,则说明该文件存在重复。
if file_name.count(repeat_p1) != 1: #4. 判断是否为1,若不为1,说明该文件为重复文件,则对该文件进行下面操作
repeat_files.append(repeat_p1) #5. 将该文件append到repeat_files中,完成对重复文件的记录
print(' '+repeat_p1) #6.打印重复文件
#将文件路径列表迭代器化
path_collect = iter(file_collect)
#函数返回值
return (path_collect,len(file_collect),repeat_files_count)
def file_copy(files_path,store_path): #开始copy文件,但是如果目的文件夹已经有同名文件,则会报错,所以这部分用到try和同名文件计数
already_exist_files_count = 0 #该变量用户记录目的文件夹中已经有的同名文件数量
for path in files_path: #自动传入需要拷贝的文件的路径列表,用for循环一个一个的copy
try: #捕捉异常
shutil.copy(path,os.path.join(store_path,path.split('/')[-1])) #通过shutil.copy拷贝,文件和权限都会被copy
except: #如果目的文件存在同名文件则copy会报错,如果出现报错则进行下一步
already_exist_files_count += 1 #1. 存在同名文件计数器 加1
return already_exist_files_count #返回同名文件计数器
def copy_compare(your_store_path): #完成copy后,该函数用于比较实际copy情况
uncopy_files = [] #1. 记录未拷贝文件名
store_files = list((os.walk(your_store_path)))[0][-1] #通过os.walk遍历目标文件,并记录目标文件的文件名,格式为列表
for file in file_name: #遍历file_scanner函数的文件名列表
if file not in store_files: uncopy_files.append(file) #并通过成员查找符 in 判断是否已经位于目的文件夹,如果不在,那么将该文件记录在uncopy_files列表
return (uncopy_files,len(store_files)) #函数返回值
#主函数
if __name__ == '__main__':
your_scan_path = r'D:/' #输入需要扫描的驱动器或者分区,采用
your_re_filter = r'.*.pptx' #输入需要匹配的文件规则,正则表达式规则
your_store_path = r'D:/TEMP test001/copy' #输入存放文件的目的文件夹
try:
os.makedirs(your_store_path) #创建用于存放数据的目的文件夹
finally:
files_path, files_match_count,repeat_files = file_scanner(your_scan_path,your_re_filter) #启动file_scanner函数
already_exist_files_count = file_copy(files_path,your_store_path) #启动file_copy函数
uncopy_files_name,have_copy_count = copy_compare(your_store_path) #启动copy_compare函数
print('\n\n========Statistics Info========\n %d Files Matched;\n %d Redundant Files;\n %d Files have in your target fold;\n %d Copied;\n %d Files success.'
%(files_match_count,repeat_files,already_exist_files_count,(have_copy_count-already_exist_files_count),(have_copy_count))) #打印统计结果
if uncopy_files_name: #未copy计数器如果生效,则进行后续操作
user_input02 = input('Need to chkeck the failure file?(Y/N):') #1. 让用户决定是否查看拷贝失败文件名
if user_input02 == 'Y': #2. 如果用户输入Y,则打印拷贝失败文件名
for Fail in uncopy_files_name:
print(Fail)