python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python整理文件夹

详解Python如何通过文件后缀整理文件夹

作者:微小冷

这篇文章主要为大家详细介绍了Python如何通过文件后缀实现整理文件夹功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

此前用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 = dct
    self.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 True
        except 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:
            continue
        dst = 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 = SUCCESS
    else:
        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这个类添加一个静态方法,从而可以快速调用

    @staticmethod
    def sort(tar, fileDct=None):
        fs = FileSystem()
        if fileDct:
            fs.update(fileDct)
        fs.sortFiles(tar)

整理结果如下

到此这篇关于详解Python如何通过文件后缀整理文件夹的文章就介绍到这了,更多相关Python整理文件夹内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文