把一个文件夹里的所有图片格式文件的文件名缩短

Renaming_3.1.py

from pathlib import Path
import random
import string

GG_LIST = ["", "jpg", "png", "webp", "0"]
GG_DICT = {"0":"", "1":"jpg", "2":"png", "3":"webp"}
# 创建一个包含所有可能字符的列表
CHARACTER_LIST = list(string.ascii_letters + string.digits)

class cmm:
    def input_path(self):
        lu = input("请指定文件夹路径:\n")
        if lu == 'r':
            return 'dd'
        if lu == 'rr':
            lu = Path(__file__).resolve().parent  # 获取当前脚本所在的路径
            print(f"将对小工具所在目录'{lu}'的图片文件执行后续重命名操作!\n")
            return lu
        while not Path(lu).exists():
            lu = input("路径未找到请重新指定:\n")
        if lu == "":
            lu = Path(__file__).resolve().parent  # 获取当前脚本所在的路径
            print(f"将对小工具所在目录'{lu}'的图片文件执行后续重命名操作!\n")
            return lu
        print(f"将对{lu}目录下的图片文件执行后续重命名操作\n")
        return lu

    def input_format(self):
        format = input("文件格式(若为0或为空则视为输入了所有图片格式):\n")
        if format == 'r':
            return 'r'
        while format not in GG_LIST:
            if format not in GG_DICT:
                format = input("暂不支持该格式,请重新指定:\n")
            else:
                format = GG_DICT[format]
        print(f"将对目录下所有格式为{format}的文件执行重命名\n" if format != "" else "将对目录下所有图片格式的文件重命名!\n")
        return format

    def input_length(self):
        length = input("想要保留的长度为__(若未输入或输入0则不会删除任何字符):\n")
        while not length.isdigit() and length != "":
            length = input("请重新指定一个整数或直接回车:\n")
        length = int(length) if length != "" else 0
        print(f"将以指定的长度{length}作为新文件名长度\n" if length != 0 else "将以原文件名长度作为新文件名长度\n")
        return length

    def input_prevent(self):
        prevent = input("向左(如'-2')或向右(如'+2')随机修改__个字符(能够大概率避免名称重复):\n")
        while True:
            if not prevent.startswith('-') and not prevent.startswith('+') and prevent != "":
                prevent = input("请重新输入(如:-1、+2)或直接回车:\n")
                continue
            if prevent[1:].isdigit() or prevent == "":# 数字符合要求则结束
                break
            prevent = input("请重新输入(如:-1、+2)或直接回车:\n")
        print(f"将向{prevent[0]}方向修改(或添加){prevent[1:]}个随机字符\n" if prevent != "" 
            else "将不修改(或添加)随机字符\n")
        prevent = int(prevent) if prevent != "" else 0
        return prevent

    def input_additions(self):
        additions = input("增加指定内容在(文件名末尾)扩展名前:\n")
        additions = additions if additions != None else ""
        print(f"将在文件名末尾添加: '{additions}'\n" if additions != "" else "不在文件名末尾添加内容\n")
        return additions

    def inf_dist(self):
        inf = {}
        inf['path'] = self.input_path()
        if inf['path'] == 'dd':
            inf['path'] = r'D:\360安全浏览器下载'
            inf['format'] = ''
            inf['length'] = 7
            inf['prevent'] = -2
            inf['additions'] = ''
            return inf
        inf['format'] = self.input_format()
        if inf['format'] == 'r':
            inf['format'] = ''
            inf['length'] = 7
            inf['prevent'] = -2
            inf['additions'] = ''
            return inf
        inf['length'] = self.input_length()
        inf['prevent'] = self.input_prevent()
        inf['additions'] = self.input_additions()
        return inf

    def __init__(self):
        inf = self.inf_dist()
        self.path = inf['path']# 路径
        self.format = inf['format']# 格式
        self.length = inf['length']# 长度
        self.prevent = inf['prevent']# 预防
        self.additions = inf['additions']# 末尾追加
        self.co1, self.co2, self.co3, self.co4 = 0, 0, 0, 0 # 计数器,用于UI部分
        self.ext_n, self.ext_g = "", ""
        self.filename = None

    def xin_len(self):
        if self.length != 0:
            end = f"新的文件名长度为 {self.length + (self.prevent if self.prevent > 0 else 0) + len(self.additions)}\n"
        else:
            end = f"新的文件名长度为 原文件名长度 + {self.prevent + len(self.additions)}\n"
        print(end)

    def Select_Characters(self):# 从列表中随机选择self.prevent个字符
        avoidance = str("".join(random.sample(CHARACTER_LIST, abs(self.prevent))))
        return avoidance

    def Folder_verification(self):# 实现非文件夹验证的方法
        file_path = self.filename
        if file_path.is_file():  
            print(f"文件名为 {self.ext_n}")
            return True
        else:
            print(f"将不会对文件夹 {self.ext_n} 执行任何操作\n")
            return False

    def Format_Validation(self):# 实现格式验证的方法
        if self.format == "": # 自动获取格式模式
            print(f"文件格式 {self.ext_g}" if self.ext_g != "" else "该文件没有后缀名")
            if self.ext_g[1:] in GG_LIST: # 进行格式验证
                return True
            print(f"将不会对格式为 {self.ext_g} 的文件执行任何操作\n")
        else: # 使用指定格式模式
            if self.ext_g[1:] == self.format: # 进行格式验证
                self.co1 += 1
                return True
            print(f"不是目标格式的文件\n")
        return False

    def Length_verification(self):# 实现长度验证的方法
        self.co4 += 1
        if self.length == "":
            self.lengthcc = self.length if self.length != 0 else len(self.ext_n) # 确定长度
            self.co2 += 1
        else:
            if len(self.ext_n) <= self.length:
                print(f"文件名长度小于等于{self.length},将直接跳过\n")
                return False
            else:
                self.lengthcc = self.length
        return True

    def shorten_image_names(self):
        name_list = list(Path(self.path).iterdir())
        for self.filename in name_list:
            self.co3 += 1
            print(f"检查第{self.co3}个文件")
            (self.ext_n , self.ext_g) = self.filename.stem, self.filename.suffix
            if self.Folder_verification() and self.Format_Validation() and self.Length_verification():# 三重验证
                self.avoidance = self.Select_Characters()# 选取随机字符
                new_filename = str( self.ext_n[:(200 if self.lengthcc <= 0 else self.lengthcc) +\
                    (0 if self.prevent > 0 else self.prevent)]) +\
                    self.avoidance + self.additions + self.ext_g
                src = Path(self.filename)  
                dst = Path(self.path) / new_filename  
                src.rename(dst)
                self.co2 += 1
                print(f"截取原名 {self.ext_n[:self.lengthcc+(0 if self.prevent > 0 else self.prevent)]}\n"
                      f"重命名为 {new_filename}\n")
        print(f"发现了{self.co4}个图片文件,修改了{self.co2}个图片文件的名称" if self.format == "" 
        else f"发现了{self.co1}个格式为 {self.format} 的图片文件,修改了{self.co2}个图片文件的名称")
        self.xin_len()
        self.count_files_in_directory()

    def count_files_in_directory(self):
        count = 0
        fil_list = Path(self.path).glob('*')
        for _ in fil_list:
            count += 1
        cha = self.co3 - count
        if cha != 0:
            print(f'-*-*-*-*-*-*\n警告!目录下文件数目发生变化{self.co3} -> {count}\n丢失了{cha}个文件'
            '可能是由于重命名后的名称和某个不同文件但相同名称的文件发生冲突,导致原先的文件被覆盖\n-*-*-*-*-*-*')
        else:
            print(f"目录下文件数目前后一致{self.co3} -> {count},结束运行。")

'''
pyinstaller --onefile --name=Renaming_3.1 --ico=D:\BaiduSyncdisk\icon\icon_01.ico Renaming_3.1.py

'''

shorten_image_names = cmm()
shorten_image_names.shorten_image_names()
_ = input(f"按下任意键退出\n")

从浏览器上下载下来的图片的文件名往往都很长,通过聊天软件接收过来的大量图片,它们的名字也都很长。

30多个字符的文件名用着不方便,2345看图王有小插件可以批量给图片重命名,功能丰富但是操作步骤比较多。

这个小程序双击后输入特定的字符,会直接对默认的文件夹路径(比如“D:\360安全浏览器下载”)里的所有图片文件开始批量重命名(甚至输入特定的字符这一步也可以删掉,双击exe后直接开始批量重命名)。

不能完全保证不会发生:两个图片文件重命名后的名称相同而导致前一个文件被后一个文件覆盖。如果文件夹里的文件数量发生了变化,程序会在运行结束的时候告诉你你有的忙了。

所以prevent这个参数(追加{prevent}个随机字符到新文件名末尾)一定不要空着,把绝对值弄到2就够用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值