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就够用。