文件分类:
假设某个路径下的文件杂乱不堪,那我们现在要把这些个文件按照文件的类型进行分类。
那我们要把文档的这些个文件放到一个文件夹中
创建"文档"文件夹,收录这些内容:excel文件,doc文件,ppt文件,txt文件
创建"图片"文件夹,收录图片文件:png,jpg,gif
创建"音频"文件夹,收录音频文件:mp3,wma,acc
创建"视频"文件夹,收录视频文件:avi,mp4,mkv
创建"其他"文件夹,收录除此以外的其他文件
import os
import shutil
dirname = r'C:\Users\Administrator\Desktop\test'
def getClass(ext):
res = [k for k, v in d.items() if ext in v]
if res:
return res[0]
else:
return '其他'
d = {'文档': ['xls', 'xlsx', 'doc', 'docx', 'ppt', 'pptx', 'txt'],
'图片': ['png', 'jpg', 'jpeg', 'gif'],
'音频': ['mp3', 'wma', 'acc'],
'视频': ['avi', 'mp4', 'mkv'],
}
for i in os.listdir(dirname):
dir_file_name = os.path.join(dirname, i)
if not os.path.isdir(dir_file_name):
file_name, file_ext = os.path.splitext(i)
dir_name = getClass(file_ext[1:])
dir_path = os.path.join(dirname , dir_name)
if not os.path.exists(dir_path) :
os.mkdir(dir_path)
shutil.move(dir_file_name,os.path.join(dir_path,i))
最近学了责任链模式,感觉可以用到这里,欢迎各位大佬指正
'''
文件分类:
假设某个路径下的文件杂乱不堪,那我们现在要把这些个文件按照文件的类型进行分类。
那我们要把文档的这些个文件放到一个文件夹中
创建"文档"文件夹,收录这些内容:excel文件,doc文件,ppt文件,txt文件
创建"图片"文件夹,收录图片文件:png,jpg,gif
创建"音频"文件夹,收录音频文件:mp3,wma,acc
创建"视频"文件夹,收录视频文件:avi,mp4,mkv
创建"其他"文件夹,收录除此以外的其他文件
为了使代码易于扩展,使用了责任链模式。扩展类需要指定此类可以处理的文件后缀(suffix_list),以及要移动到的文件夹名(dir)
扩展时需要在organizeDocuments中声明扩展类的实例,并把该实例添加到责任链中。
'''
import os
import shutil
class BaseHandler:
'''基本处理类,suffix_list指此类可以处理的文件后缀, dir指要移动到的文件夹名'''
suffix_list = {}
dir = "其他"
def moveFile(self, source_file, target_file):
'''移动文件'''
dir, _ = os.path.split(target_file)
if not os.path.exists(dir):
os.makedirs(dir)
shutil.move(source_file, target_file) #暂时不处理文件名冲突
def setNext(self, nexthandler):
'''采用责任链模式,设置下一个handler'''
self.nexthandler = nexthandler
def handle(self, source_dir:str, filename:str, target_dir:str):
suffix = filename.split('.')[-1] #得到文件后缀
if suffix in self.suffix_list or "all" in self.suffix_list:
#如果此后缀可以被处理或者这是OtheroHandler的实例
source_file = os.path.join(source_dir, filename)
target_file = os.path.join(target_dir, self.dir, filename)
self.moveFile(source_file, target_file)
else: #使用下一个handler实例来处理
self.nexthandler.handle(source_dir, filename, target_dir)
class DocumentHandler(BaseHandler):
suffix_list = {'xls', 'xlsx', 'doc', 'docx', 'ppt', 'pptx', 'txt'}
dir = "文档"
class PictureHandler(BaseHandler):
suffix_list = {"png", "jpg", "gif"}
dir = "图片"
class AudioHandler(BaseHandler):
suffix_list = {"mp3", "wma", "acc"}
dir = "音频"
class VideoHandler(BaseHandler):
suffix_list = {"avi", "mp4", "mkv"}
dir = "视频"
class OtheroHandler(BaseHandler):
'''此类的实例可以将任何文件移动到“其他”文件夹,因而放在责任链的最后'''
suffix_list = {"all"}
dir = "其他"
def organizeDocuments(source_dir, target_dir):
'''整理文件,此函数会将source_dir下所有文件全部移动到target_dir(通过递归查找所有文件夹)!!!
@param str source_dir: 源文件夹路径
@param str target_dir: 目标文件夹路径
'''
def findAllFiles(source_dir):
'''递归查找所有文件'''
for fname in os.listdir(source_dir):
fpath = os.path.join(source_dir, fname)
if os.path.isfile(fpath):
yield source_dir, fname
else: #如果是文件夹则递归寻找。假如不需要查找source_dir文件夹下所有的文件,请把else下的代码注释掉
for dir, fname in findAllFiles(fpath):
yield dir, fname
#声明handler
dochand = DocumentHandler()
pichand= PictureHandler()
audiohand = AudioHandler()
videohand = VideoHandler()
otherhand = OtheroHandler()
#组装责任链
dochand.setNext(pichand) #责任链起点dochand
pichand.setNext(audiohand)
audiohand.setNext(videohand)
videohand.setNext(otherhand)
for source_dir, fname in findAllFiles(source_dir):
print(source_dir, fname)
dochand.handle(source_dir, fname, target_dir)
if __name__ == "__main__":
source_dir = r"E:\source"
target_dir = r"E:\target"
organizeDocuments(source_dir, target_dir)