Python批量修改自定义文件名的程序

时间:2023-01-08 14:54:28

一个用于批量处理文件名的python程序

# rename(path_value , file_type, name_operation, keepName = False ,pre="",suffix=""):
#rename("D:\\testFile", "jpg", 2) ## 前三个参数必须 后三个参数可选


# rename("D:\\testFile","jpg",0,True,"#","@")

# for i in range(18):
# rename("D:\\testFile", "jpg", i)
# time.sleep(3)

# for i in range(1000):
# valueI = random.randint(0, 17);
# rename("D:\\testFile", "jpg", valueI, True, "#", "@")
# time.sleep(3)

rename(path_value , file_type, name_operation, keepName = False ,pre=”“,suffix=”“)

# 文件重命名程序
import os;
import sys
import time, datetime
import random

global absolutepath


class switch(object):
    def __init__(self, value):
        self.value = value
        self.fall = False

    def __iter__(self):
        """Return the match method once, then stop"""
        yield self.match
        raise StopIteration

    def match(self, *args):
        """Indicate whether or not to enter a case suite"""
        if self.fall or not args:
            return True
        elif self.value in args:  # changed for v1.5, see below
            self.fall = True
            return True
        else:
            return False


def sizeM(file):
    fsize = os.path.getsize(absolutepath + file)
    fsize = fsize / float(1024 * 1024)
    var = round(fsize, 2)
    vatInt = int(var / 1.0)
    if (vatInt < 1):  # 返回KB字符串标识 容易造成名字重复 1M 返回
        fsizeKB = os.path.getsize(absolutepath + file)
        fsizeKB = fsizeKB / float(1024)
        return str(int(fsizeKB)) + "KB"
    return str(vatInt) + "MB"


def sizeK(file):
    fsize = os.path.getsize(absolutepath + file)
    fsize = fsize / float(1024)
    var = round(fsize, 2)
    vatInt = int(var / 1.0)
    if (vatInt < 1):
        return "1KB";
    return str(vatInt) + "KB"


def strTime(times):
    time_local = time.localtime(times)
    timeStr = time.strftime("%Y-%m-%d", time_local)
    return timeStr;


def rename(path_value, file_type, name_operation, keepName=False, pre="", suffix=""):
    sizeMap = {}
    timeMap = {}
    listSize = []  ## 从大到小
    listTime = []  ## 从大到小
    listSize_low = []  ## 从小到大
    listTime_low = []  ## 从小到大
    nameFlag = keepName  ## 是否包含名字标识
    opera = name_operation;
    count = 0;
    path = 'D:\\testFile';
    path = path_value;
    filelist = os.listdir(path)  # 该文件夹下所有的文件(包括文件夹)
    global absolutepath
    absolutepath = path + "\\"
    print(str("Files------" + str(filelist)))
    for files in filelist:  # 遍历所有文件 得到所有文件的大小 并保存到Map中 Map<File,size_KB>
        Olddir = os.path.join(path, files);  # 原来的文件路径
        print(str("OLD----" + Olddir))
        if os.path.isdir(Olddir):  # 如果是文件夹则跳过
            continue;
        filename = os.path.splitext(files)[0];  # 文件名
        filetype = os.path.splitext(files)[1];  # 文件原先扩展名
        sizeTemp = os.path.getsize(absolutepath + files)
        # print("oriSize:" + str(os.path.getsize(files)))
        # print("Oriname:"+filename+" sizeK:"+str(sizeK(files)) +" sizeM:"+ str(sizeM(files))+" CreateTime"+str(os.path.getctime(files)))
        timeMap[os.path.getctime(absolutepath + files)] = files
        sizeMap[os.path.getsize(absolutepath + files)] = files
        listSize.append(os.path.getsize(absolutepath + files))
        listTime.append(os.path.getctime(absolutepath + files))
        listSize_low.append(os.path.getsize(absolutepath + files))
        listTime_low.append(os.path.getctime(absolutepath + files))
        # timeMmap.__setitem__(files,os.path.getctime(files))
        # = timeMmap + {files,os.path.getctime(files)}
        # sizeMap.__setitem__(files,os.path.getsize(files))
    # print("listTime-size="+str(len(listTime)))
    print("listTime=" + str((listTime)))
    # print("listSize-size="+str(len(listSize)))
    print("listSize=" + str((listSize)))
    print("=========================")
    listTime_low.sort()  # sort 默认为从小到大
    listSize_low.sort()
    listTime = sorted(listTime, reverse=True)
    listSize = sorted(listSize, reverse=True)
    print("listTime=" + str((listTime)))
    print("listTime_low=" + str((listTime_low)))
    print("=========================")
    print("listSize=" + str((listSize)))
    print("listSize_low=" + str((listSize_low)))
    print("timeMap = " + str(timeMap))
    print("SizeMap = " + str(sizeMap))
    filelist = os.listdir(path)  # 该文件夹下所有的文件(包括文件夹)
    mCount = -1;
    for files in filelist:  # 遍历所有文件
        Olddir = os.path.join(path, files);  # 原来的文件路径
        if os.path.isdir(Olddir):  # 如果是文件夹则跳过
            continue;
        newFileName = "";
        mCount = mCount + 1
        origName = os.path.splitext(files)[0];

        # 0 ---- 保持原有文件名不变 原有名字--> 原有名字
        # 1 ---- 从0开始重命名文件名称 按照读取顺序进行排序 原有名字--> 0
        # 2 ---- 从0开始重命名文件名称 添加中括号[] 按照读取顺序进行排序 原有名字--> [0]
        # 3 ---- 在原有名字之前添加序号从0开始的序号0_ 原有名字--> 0_原有名字
        # 4 ---- 计算文件大小进行排序,最大size的文件名为0_xxKB,最小size的文件名最后 原有名字--> 0_xxKB (文件排序 大到小KB) ## 小于1KB 则使用1KB 表示 小于1MB大小的使用1MB表示
        # 5 ---- 计算文件大小进行排序,最大size的文件名为0_xxMB,最小size的文件名最后 原有名字--> 0_xxMB(文件排序 大到小MB) ## 小于1KB 则使用1KB 表示 小于1MB大小的使用1MB表示
        # 6 ---- 计算文件大小进行排序,最小size的文件名为0_xxKB,最大size的文件名最后 原有名字--> 0_xxKB(文件排序 小到大KB)## 小于1KB 则使用1KB 表示 小于1MB大小的使用1MB表示
        # 7 ---- 计算文件大小进行排序,最小size的文件名为0_xxMB,最大size的文件名最后 原有名字--> 0_xxMB(文件排序 小到大MB)## 小于1KB 则使用1KB 表示 小于1MB大小的使用1MB表示
        # 8 ---- 计算文件创建时间并进行排序 最早第一创建的文件名为0_xxxx-xx-xx 原有名字--> 0_2018-01-01 1_2018-01-01
        # 9 ---- 计算文件创建时间并进行排序 最晚第一创建的文件名为0_xxxx-xx-xx 原有名字--> 0_2018-03-01 0_2018-02-01
        # 10 ---- 计算文件创建的时间 并以此为依据排序,再添加上文件的大小KB 最早(离现在最远)第一创建的文件名为 0_xxxx-xx-xx_xxKB
        # 11 ---- 计算文件创建的时间 并以此为依据排序,再添加上文件的大小MB 最早(离现在最远)第一创建的文件名为 0_xxxx-xx-xx_xxMB
        # 12 ---- 计算文件创建的时间 并以此为依据排序,再添加上文件的大小KB 最晚(离现在最近)创建的文件名为 0_xxxx-xx-xx_xxKB
        # 13 ---- 计算文件创建的时间 并以此为依据排序,再添加上文件的大小KB 最晚(离现在最近)创建的文件名为 0_xxxx-xx-xx_xxMB
        # 14 ---- 计算文件大小 并以此为依据排序,再添加上文件的创建时间 文件最大排第一 创建的文件名为 0_xxKB_xxxx-xx-xx
        # 15 ---- 计算文件大小 并以此为依据排序,再添加上文件的创建时间 文件最大排第一 创建的文件名为 0_xxMB_xxxx-xx-xx
        # 16 ---- 计算文件大小 并以此为依据排序,再添加上文件的创建时间 文件最小排第一 创建的文件名为 0_xxKB_xxxx-xx-xx
        # 17 ---- 计算文件大小 并以此为依据排序,再添加上文件的创建时间 文件最小排第一 创建的文件名为 0_xxMB_xxxx-xx-xx
        newFileName = origName;
        for case in switch(opera):
            if case(0):
                print("operaNum = " + str(0))

                break
            if case(1):
                print("operaNum = " + str(1))
                suijishu = random.randint(0, 99);
                newFileName = str(mCount) + "_" + str(suijishu);
                break
            if case(2):
                print("operaNum = " + str(2))
                suijishu = random.randint(0, 99);
                newFileName = "[" + str(mCount) + "_" + str(suijishu) + "]";
                break
            if case(3):
                print("operaNum = " + str(3))
                # newFileName = str(mCount)+"_"+origName;
                newFileName = str(mCount) + "_" + origName;
                break
            if case(4):
                print("operaNum = " + str(4))
                # mSize = sizeMap[os.path.getsize(files)] # 放置文件大小的Map
                intSizeK = sizeK(files)
                mIndex = listSize.index(os.path.getsize(absolutepath + files))  # 依据文件大小排序 的序号
                newFileName = str(mIndex) + "_" + str(intSizeK);
                break
            if case(5):
                print("operaNum = " + str(5))
                # mSize = sizeMap[os.path.getsize(files)] # 放置文件大小的Map
                intSizeK = sizeM(files)
                mIndex = listSize.index(os.path.getsize(absolutepath + files))  # 依据文件大小排序 的序号
                newFileName = str(mIndex) + "_" + str(intSizeK);
                break
            if case(6):
                print("operaNum = " + str(6))
                intSizeK = sizeK(files)
                mIndex = listSize_low.index(os.path.getsize(absolutepath + files))  # 依据文件大小排序 的序号
                newFileName = str(mIndex) + "_" + str(intSizeK);
                break
            if case(7):
                print("operaNum = " + str(7))
                # mSize = sizeMap[files] # 放置文件大小的Map
                intSizeM = sizeM(files)
                mIndex = listSize_low.index(os.path.getsize(absolutepath + files))  # 依据文件大小排序 的序号
                newFileName = str(mIndex) + "_" + str(intSizeM);
                break

            if case(8):
                print("operaNum = " + str(8))
                # 放置文件大小的Map 得到时间 依据时间得到字符串
                timeStr = strTime(os.path.getctime(absolutepath + files))
                mIndex = listTime.index(os.path.getctime(absolutepath + files))  # 依据文件大小排序 的序号
                suijishu = random.randint(0, 99);
                newFileName = str(mIndex) + "_" + timeStr + "_" + str(suijishu);
                break
            if case(9):
                print("operaNum = " + str(9))
                timeStr = strTime(os.path.getctime(absolutepath + files))
                mIndex = listTime_low.index(os.path.getctime(absolutepath + files))  # 依据文件大小排序 的序号
                newFileName = str(mIndex) + "_" + timeStr;
                break
            if case(10):
                print("operaNum = " + str(10))
                timeStr = strTime(os.path.getctime(absolutepath + files))
                intSizeK = sizeK(files)
                mIndex = listTime.index(os.path.getctime(absolutepath + files))  # 依据文件大小排序 的序号
                newFileName = str(mIndex) + "_" + timeStr + "_" + str(intSizeK);

                break
            if case(11):
                print("operaNum = " + str(11))
                timeStr = strTime(os.path.getctime(absolutepath + files))
                intSizeM = sizeM(files)
                mIndex = listTime.index(os.path.getctime(absolutepath + files))  # 依据文件大小排序 的序号
                newFileName = str(mIndex) + "_" + timeStr + "_" + str(intSizeM);
                break
            if case(12):
                print("operaNum = " + str(12))
                intSizeK = sizeK(files)
                timeStr = strTime(os.path.getctime(absolutepath + files))
                mIndex = listTime_low.index(os.path.getctime(absolutepath + files))  # 依据文件大小排序 的序号
                newFileName = str(mIndex) + "_" + timeStr + "_" + str(intSizeK);
                break

            # 13 ---- 计算文件创建的时间 并以此为依据排序,再添加上文件的大小KB 最晚(离现在最近)创建的文件名为 0_xxxx-xx-xx_xxMB
            # 14 ---- 计算文件大小 并以此为依据排序,再添加上文件的创建时间 文件最大排第一 创建的文件名为 0_xxKB_xxxx-xx-xx
            # 15 ---- 计算文件大小 并以此为依据排序,再添加上文件的创建时间 文件最大排第一 创建的文件名为 0_xxMB_xxxx-xx-xx
            # 16 ---- 计算文件大小 并以此为依据排序,再添加上文件的创建时间 文件最小排第一 创建的文件名为 0_xxKB_xxxx-xx-xx
            # 17 ---- 计算文件大小 并以此为依据排序,再添加上文件的创建时间 文件最小排第一 创建的文件名为 0_xxMB_xxxx-xx-xx
            if case(13):
                print("operaNum = " + str(13))
                intSizeM = sizeM(files)
                timeStr = strTime(os.path.getctime(absolutepath + files))
                mIndex = listTime_low.index(os.path.getctime(absolutepath + files))  # 依据文件大小排序 的序号
                newFileName = str(mIndex) + "_" + timeStr + "_" + str(intSizeM);
                break
            if case(14):
                print("operaNum = " + str(14))
                timeStr = strTime(os.path.getctime(absolutepath + files))
                intSizeK = sizeK(files)
                mIndex = listSize.index(os.path.getsize(absolutepath + files))  # 依据文件大小排序 的序号
                newFileName = str(mIndex) + "_" + str(intSizeK) + "_" + timeStr;
                break
            if case(15):
                print("operaNum = " + str(15))
                timeStr = strTime(os.path.getctime(absolutepath + files))
                intSizeM = sizeM(files)
                mIndex = listSize.index(os.path.getsize(absolutepath + files))  # 依据文件大小排序 的序号
                newFileName = str(mIndex) + "_" + str(intSizeM) + "_" + timeStr;
                break
            if case(16):
                print("operaNum = " + str(16))
                timeStr = strTime(os.path.getctime(absolutepath + files))
                intSizeK = sizeK(files)
                mIndex = listSize_low.index(os.path.getsize(absolutepath + files))  # 依据文件大小排序 的序号
                newFileName = str(mIndex) + "_" + str(intSizeK) + "_" + timeStr;
                break
            if case(17):
                print("operaNum = " + str(17))
                timeStr = strTime(os.path.getctime(absolutepath + files))
                intSizeM = sizeM(files)
                mIndex = listSize_low.index(os.path.getsize(absolutepath + files))  # 依据文件大小排序 的序号
                newFileName = str(mIndex) + "_" + str(intSizeM) + "_" + timeStr;
                break
            if case():
                print("not in 0-17")
        print("newFileName:" + newFileName)
        filename = os.path.splitext(files)[0];  # 原先文件名
        filetype = os.path.splitext(files)[1];  # 文件原先扩展名
        if nameFlag == True:
            print("需要保留原始文件名字")
            if newFileName.find(origName) > -1:
                print("新文件名已包含 原始文件名")
            else:
                print("新文件名不包含原始文件名 需要再次添加")
                newFileName = newFileName + "_" + origName
        print("老名字:" + Olddir + " 新名字:" + pre + newFileName + suffix + "." + file_type)
        Newdir = os.path.join(path, pre + newFileName + suffix + "." + file_type);  # 新的文件路径 + 参数定义扩展名
        os.rename(Olddir, Newdir)


# 参数1---文件夹所在路径
# 参数2---文件后缀
# 参数3---定义文件名定义的规则
# 0 ---- 保持原有文件名不变 原有名字--> 原有名字
# 1 ---- 从0开始重命名文件名称 按照读取顺序进行排序 原有名字--> 0
# 2 ---- 从0开始重命名文件名称 添加中括号[] 按照读取顺序进行排序 原有名字--> [0]
# 3 ---- 在原有名字之前添加序号从0开始的序号0_ 原有名字--> 0_原有名字
# 4 ---- 计算文件大小进行排序,最大size的文件名为0_xxKB,最小size的文件名最后 原有名字--> 0_xxKB (文件排序 大到小KB) ## 小于1KB 则使用1KB 表示 小于1MB大小的使用1MB表示
# 5 ---- 计算文件大小进行排序,最大size的文件名为0_xxMB,最小size的文件名最后 原有名字--> 0_xxMB(文件排序 大到小MB) ## 小于1KB 则使用1KB 表示 小于1MB大小的使用1MB表示
# 6 ---- 计算文件大小进行排序,最小size的文件名为0_xxKB,最大size的文件名最后 原有名字--> 0_xxKB(文件排序 小到大KB)## 小于1KB 则使用1KB 表示 小于1MB大小的使用1MB表示
# 7 ---- 计算文件大小进行排序,最小size的文件名为0_xxMB,最大size的文件名最后 原有名字--> 0_xxMB(文件排序 小到大MB)## 小于1KB 则使用1KB 表示 小于1MB大小的使用1MB表示
# 8 ---- 计算文件创建时间并进行排序 最早第一创建的文件名为0_xxxx-xx-xx 原有名字--> 0_2018-01-01 1_2018-01-01
# 9 ---- 计算文件创建时间并进行排序 最晚第一创建的文件名为0_xxxx-xx-xx 原有名字--> 0_2018-03-01 0_2018-02-01
# 10 ---- 计算文件创建的时间 并以此为依据排序,再添加上文件的大小KB 最早(离现在最远)第一创建的文件名为 0_xxxx-xx-xx_xxKB
# 11 ---- 计算文件创建的时间 并以此为依据排序,再添加上文件的大小MB 最早(离现在最远)第一创建的文件名为 0_xxxx-xx-xx_xxMB
# 12 ---- 计算文件创建的时间 并以此为依据排序,再添加上文件的大小KB 最晚(离现在最近)创建的文件名为 0_xxxx-xx-xx_xxKB
# 13 ---- 计算文件创建的时间 并以此为依据排序,再添加上文件的大小KB 最晚(离现在最近)创建的文件名为 0_xxxx-xx-xx_xxMB
# 14 ---- 计算文件大小 并以此为依据排序,再添加上文件的创建时间 文件最大排第一 创建的文件名为 0_xxKB_xxxx-xx-xx
# 15 ---- 计算文件大小 并以此为依据排序,再添加上文件的创建时间 文件最大排第一 创建的文件名为 0_xxMB_xxxx-xx-xx
# 16 ---- 计算文件大小 并以此为依据排序,再添加上文件的创建时间 文件最小排第一 创建的文件名为 0_xxKB_xxxx-xx-xx
# 17 ---- 计算文件大小 并以此为依据排序,再添加上文件的创建时间 文件最小排第一 创建的文件名为 0_xxMB_xxxx-xx-xx
# 参数4---keepName 默认为FALSE , 用于提供用户原则是否 在前面参数生成的名字中加入 文件原有名字 + _原有名字
# 参数5---可以在前面四个参数确定的文件名字前 加入 静态的前缀 prefix
# 参数6---可以在前面四个参数确定的文件名字前 加入 静态的后缀 suffix

# rename(path_value , file_type, name_operation, keepName = False ,pre="",suffix=""):
rename("D:\\testFile", "jpg", 2)  ## 前三个参数必须 后三个参数可选
# rename("D:\\testFile","jpg",0,True,"#","@")

# for i in range(18):
# rename("D:\\testFile", "jpg", i)
# time.sleep(3)

# for i in range(1000):
# valueI = random.randint(0, 17);
# rename("D:\\testFile", "jpg", valueI, True, "#", "@")
# time.sleep(3)