前言

有时候我们需要批量修改一些文件的后缀名

作为程序员我们自然得自己写点脚本了

本文通过python来实现批量修改文件名,同时还能修改其子文件夹中的文件

完整代码

import os


class ChangeSuffix():
    def __init__(self, absolutePath, beforeSuffix, afterSuffix) -> None:
        self.absolutePath = absolutePath
        self.beforeSuffix = beforeSuffix
        self.afterSuffix = afterSuffix

    def work(self, flag=False):
        # 需要修改的后缀长度
        LEN = len(self.beforeSuffix)
        for curDir, subDir, allFile in os.walk(self.absolutePath):
            print("当前主目录:", curDir)
            print("当前主目录下的所有目录", subDir)
            print("当前主目录下的所有文件", allFile)
            for curFile in allFile:
                curFileSuffix = curFile[-LEN:]
                # 判断后缀是否相同,且后缀的前一个是否是.点号
                if curFileSuffix == self.beforeSuffix and curFile[-(LEN+1)] == '.':
                    oldName = os.path.join(curDir, curFile)  # 化为绝对路径
                    newName = oldName[:-LEN] + self.afterSuffix
                    os.rename(oldName, newName)
            # flag 是否递归子文件夹
            if not flag:
                break
        return True


if __name__ == "__main__":
    absolutePath = input("请输入目标文件夹的绝对路径:")
    beforeSuffix = input("请输入需要修改的后缀:")
    afterSuffix = input("请输入修改之后的后缀:")
    needRecursion = input("是否需要操作该目录下的子文件夹(0/1): ")

    print("************ START ***********")
    change = ChangeSuffix(absolutePath, beforeSuffix, afterSuffix)
    if change.work(needRecursion != "0"):
        print("************ END ***********")

效果展示

原目录结构

C:\Users\windows\Desktop\素材>tree /f
文件夹 PATH 列表
卷序列号为 B87D-2753
C:.
│  1.jpeg
│  main.exe
│
└─子文件夹
    │  2.jpeg
    │  3.jpeg
    │
    ├─孙子文件夹1
    │      4.jpeg
    │
    └─孙子文件夹2
            5.jpeg

运行展示

这里用命令行来展示

分别输入四条信息

  • 目标文件夹的绝对路径
  • 需要修改的后缀
  • 修改之后的后缀
  • 是否需要操作该目录下的子文件夹(0/1)
E:\VS Code\python>python ./test.py
请输入目标文件夹的绝对路径:C:\Users\windows\Desktop\素材
请输入需要修改的后缀:jpeg
请输入修改之后的后缀:png
是否需要操作该目录下的子文件夹(0/1): 1
************ START ***********
当前主目录: C:\Users\windows\Desktop\素材
当前主目录下的所有目录 ['子文件夹']
当前主目录下的所有文件 ['1.jpeg', 'main.exe']
当前主目录: C:\Users\windows\Desktop\素材\子文件夹
当前主目录下的所有目录 ['孙子文件夹1', '孙子文件夹2']
当前主目录下的所有文件 ['2.jpeg', '3.jpeg']
当前主目录: C:\Users\windows\Desktop\素材\子文件夹\孙子文件夹1
当前主目录下的所有目录 []
当前主目录下的所有文件 ['4.jpeg']
当前主目录: C:\Users\windows\Desktop\素材\子文件夹\孙子文件夹2
当前主目录下的所有目录 []
当前主目录下的所有文件 ['5.jpeg']
************ END ***********

修改效果

C:\Users\windows\Desktop\素材>tree /f
文件夹 PATH 列表
卷序列号为 B87D-2753
C:.
│  1.png
│  main.exe
│
└─子文件夹
    │  2.png
    │  3.png
    │
    ├─孙子文件夹1
    │      4.png
    │
    └─孙子文件夹2
            5.png

代码讲解

主要函数

    def work(self, flag=False):
        # 需要修改的后缀长度
        LEN = len(self.beforeSuffix)
        for curDir, subDir, allFile in os.walk(self.absolutePath):
            print("当前主目录:", curDir)
            print("当前主目录下的所有目录", subDir)
            print("当前主目录下的所有文件", allFile)
            for curFile in allFile:
                curFileSuffix = curFile[-LEN:]
                # 判断后缀是否相同,且后缀的前一个是否是.点号
                if curFileSuffix == self.beforeSuffix and curFile[-(LEN+1)] == '.':
                    oldName = os.path.join(curDir, curFile)  # 化为绝对路径
                    newName = oldName[:-LEN] + self.afterSuffix
                    os.rename(oldName, newName)
            # flag 是否递归子文件夹
            if not flag:
                break
        return True

os.walk(path)

这个函数会返回三个内容

  • curDir 当前主目录 str
  • subDir 当前主目录下的所有目录 list
  • allFile 当前主目录下的所有文件 list

并且在第二次循环开始是默认递归上次的子目录,因此就能达到遍历该目录下的所有文件的作用

如果不想要递归子文件夹的内容,则可以设置一个flag来结束循环

for curDir, subDir, allFile in os.walk(self.absolutePath):
    pass

判断文件

判断文件的方式比较简单

直接截取该文件名的末尾,判断是否和需要修改的后缀名相等,且前一个字符是点好'.'

修改

# 两个都要绝对路径
os.rename(oldName, newName)



END

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐