文章目录
- 文件夹类型字典
- 移动文件
- 主流程
此前用Python实现了根据文件后缀整理文件夹的方法,见此文:Python根据文件后缀整理文件夹。但这篇博客并没有进行良好的封装,下面仍以文件夹整理为目的,用类来重新实现次功能。
文件夹类型字典
根据熵增原理,我们的文件夹在经过一段时间之后会变得混乱不堪,尤其是桌面和下载文件夹,找个东西会十分费劲,特别影响效率,所以用Python做一个文件夹整理小工具还是很有必要的。
而最常见的整理方法,就是按照文件类型,为了实现这个目标,可以先做一个文件类型字典,来绑定文件类型和后缀。
为此,可创建一个类
class FileSystem:def __init__(self, root) -> None:self.fileDct = FILE_DCT
其中FILE_DCT
是默认的文件字典,
# 封装在
FILE_DCT = {"图片" : [".jpg", ".png", ".jpeg", ".gif"],"视频" : [".mp4", ".mkv"],"音乐" : [".mp3", ".wav"],"文档" : [".pdf"],"文本" : [".csv", ".txt"],"源码" : [".py", ".c", ".cpp", ".php"],"office": [".docx",".xlsx", ".pptx", ".doc", ".ppt", ".xls"],"压缩包": [".zip", ".tgz", ".rar", ".tar", ".7z"],"安装包": [".msi", ".exe"],
}
而文件整理的逻辑是,先创建图片、视频等文件夹,然后通过文件的后缀找到其对应的文件类别,然后移动到相应的文件夹。为了更加便捷地实现这个功能,做一个反向的字典,用以通过后缀返回文件夹
# FileSystem的成员方法,复制时注意缩进
def setExDct(self):self.exDct = {}for key in self.fileDct:self.exDct.update({ex:key for ex in self.fileDct[key]})
考虑到更新字典的可能性,创建update方法。
def update(self, dct):self.fileDct = dctself.setExDct()
移动文件
接下来就是移动文件,这里面有两个问题,一是目标文件夹不存在,则需要新建;二则是目标文件夹中已经有了同名文件,那么则需要报错
import os
import shutil
pJoin = os.path.join
pExist = os.path.exists# 此为FileSystem的成员方法def mvFile(self, src, dst):if not pExist(dst):os.makedirs(dst)try:shutil.move(src, dst)return Trueexcept Exception as e:print(e)return False
主流程
接下来就是整个文件夹整理的主流程
from pathlib import Path# FileSystem的成员方法,复制时注意缩进
# tar是准备整理的文件夹
def sortFiles(self, tar):files = os.listdir(tar)fsErr = []self.history = []for f in files:src = pJoin(tar, f)print(src)ex = Path(src).suffix.lower()if ex not in self.exDct:continuedst = pJoin(tar, self.exDct[ex])if self.mvFile(src, dst):self.history.append([src, dst])else:fsErr.append(src)self.setErrInfo(fsErr)# 设置错误信息
def setErrInfo(self, fsErr):SUCCESS = "全部文件移动成功"ERROR = "以下文件移动失败:\r\n"if len(fsErr) == 0:self.errInfo = SUCCESSelse:self.errInfo = ERROR + "\r\n".join(fsErr)
其中,self.history用于存储复制结果,如果感觉整理逻辑不对,想要恢复整理之前的样子,则可动用history中的列表。
# FileSystem的成员方法,复制时注意缩进
def restore(self):fsErr = []for src, dst in self.history:if not self.mvFile(dst, src):fsErr.append(dst)self.setErrInfo(fsErr)
最后,为FileSystem这个类添加一个静态方法,从而可以快速调用
@staticmethoddef sort(tar, fileDct=None):fs = FileSystem()if fileDct:fs.update(fileDct)fs.sortFiles(tar)
整理结果如下