Python 实现脚本:批量重名命文件
前言:因公司有需要对文件进行大量的重名命工作,所以用python设计了一个python 小脚本
使用os.listdir()方法返回当前目录下的所有文件名,对每一个文件名字符串用str.replace()方法做替换操作,然后用os.rename()方法重命名。
path = input("****请输入数据的路径,或者输入expiry退出程序:")
"""for i in os.listdir(path):
if i == "real":
rename(path)
else:
attack_pic(path)"""
except Exception as msg:
print(str(msg))
except KeyboardInterrupt as msg:
print(msg)
else:
if path == 'expiry':
break
data_list = os.listdir(path)
if data_list:
print("正在重名命,请稍等!!!")
for data_dir in data_list:
data_type = data_dir.split('_')[0]
if data_type == "real":
rename(path)
else:
attack_pic(path)
break
print("************重名命完成*****************")
扩展
- 可以加入import threading多线程业务
下面贴上完整代码
import os
import threading
def get_pattern(path):
"""获取真假人模式"""
return os.listdir(path)
def get_users(path):
"""获取目录下的所有用户"""
return os.listdir(path)
def get_envs(path):
"""获取环境"""
return os.listdir(path)
def get_png(path):
"""获取路径下的所有图片"""
return os.listdir(path)
def get_preview_type(preview, env, user, env_path):
"""什么照片打印的纸张"""
previews = {
'putongzhi': 'putongzhi',
'xiangzhi': 'xiangzhi',
'caisezhi': 'caisezhi',
'tongbanzhi': 'tongbanzhi',
'liusuanzhi': 'liusuanzhi',
'hongwai': 'hongwai'
}
try:
preview_type = previews[preview]
return preview_type
except KeyError:
print(f"***{env_path}\\{env} 环境中的{user} {preview}打印的纸张,命名正确!!!")
def get_attack_type(att_type, env, user, env_path):
"""攻击手段类型"""
attacks = {
'bucaijian': 'bucaijian',
'caijian': 'caijian',
'yanjing': 'yanjing',
'yanjingzuiba': 'yanjingzuiba',
'yanjingzuibabizi': 'yanjingzuibabizi',
'yanjingbizi': 'yanjingbizi',
'mianju': 'mianju'
}
try:
attack_type = attacks[att_type]
return attack_type
except KeyError:
print(f"***{env_path}\\{env} 环境中的 {user} 攻击类型 {att_type} 命名错误,请检查命名!!!!!!")
def get_paper_type(paper, env, user, serial, env_path):
"""照片的采集设备"""
papers = {
'940': '940',
'850': '850',
'mi8': 'mi8',
'heibai': 'heibai'
}
try:
paper_type = papers[paper]
return paper_type
except KeyError:
print(f"***{env_path}\\{env} 环境中的{user} 纸张类型e{paper} 命名错误,请检查命名!!!")
def get_environment(env, env_path):
"""获取环境"""
environments = {
'shinei': 'shinei',
'shiwai': 'shiwai',
'anshi': 'anshi',
'loutijian': 'loutijian',
'zoulang': 'zoulang',
'3lou': '3lou',
'diantikou': 'diantikou',
'diantili': 'diantili'
}
try:
environment = environments[env] # 获取环境
return environment
except KeyError:
print(f"***环境{env_path}\\{env} 命名错误,请检查命名!!!!")
def rename(path):
"""重命名真人"""
pattern = get_pattern(path)
"""获取目录真假人"""
for pa in pattern:
users_path = os.path.join(path, pa)
users = get_users(users_path)
"""获取所有用户"""
for user in users:
env_path = os.path.join(users_path, user)
envs = get_envs(env_path)
"""获取所有环境"""
for env in envs:
png_path = os.path.join(env_path, env)
pngs = get_png(png_path)
"""获取图片"""
for png in pngs:
"""拼接与切片"""
re_rename = '_'.join((png[:3], pa, user, env, png[4:]))
old_name = os.path.join(png_path, png)
new_name = os.path.join(png_path, re_rename)
os.rename(old_name, new_name)
# r"F:\sc1\anshi\940_hongwai_photographic_caijian_zhangwei_1"
# pic_name, username, age, device, environment, pic_path, attack_type='', paper_type='', preview_type=''
def get_new_name(pic_name, paper, preview_type, attack_type, env, username, serial, pic_path):
"""新名字"""
s = '_'
# new_pic_name = pic_name[:3] + s + username + s + age + s + device + s + environment + s + attack_type +
# paper_type + pic_name[3:]
new_pic_name = pic_name[:3] + s + paper + s + preview_type + s + attack_type + s + username + s + env + s + serial + pic_name[3:]
# os.chdir(pic_path)
# print("new_name:" + new_pic_name)
# old_name = pic_path + os.sep + pic_name
old_name = os.path.join(pic_path, pic_name)
# print("old_name:" + old_name)
# new_name = pic_path + os.sep + new_pic_name
new_name = os.path.join(pic_path, new_pic_name)
os.rename(old_name, new_name)
def attack_pic(env_path, device='sc035'):
"""重命名假人"""
for env in os.listdir(env_path):
environment = get_environment(env, env_path)
user_path = env_path + os.sep + env
user_list = os.listdir(user_path)
if user_list:
for user in user_list:
try:
# username, paper, att_type, age = user.split('_')
"""new_pic_name = pic_name[:3] + s + paper_type + s + preview_type + s + attack_type + s + environment + username + s + age + pic_name[4:]"""
paper, preview, att_type, username, serial = user.split('_')
except ValueError:
print("命名错误11111")
else:
# def get_attack_type(att_type, env, user, env_path):
attack_type = get_attack_type(att_type, env, user, env_path)
paper_type = get_paper_type(paper, env, user, serial, env_path)
preview_type = get_preview_type(preview, env, user, env_path)
if attack_type and paper_type:
attack_type = attack_type
paper_type = paper_type
preview_type = preview_type
pic_path = user_path + os.sep + user
pic_list = os.listdir(pic_path)
if pic_list:
for pic_name in pic_list:
if username not in pic_name:
# new_pic_name = pic_name[:3] + s + paper_type + s + preview_type + s + attack_type + s + environment + username + s + serial + pic_name[3:]
# pic_name, username, serial, device, environment, pic_path, attack_type, paper_type
attack_thread = threading.Thread(target=get_new_name, args=(
pic_name, paper_type, preview_type, attack_type, environment, username, serial, pic_path)
)
attack_thread.start()
else:
print(f'图片目录{pic_path} 为空,请检查!!!!')
else:
print(f'用户目录{user_path} 为空,请检查!!!')
if __name__ == '__main__':
try:
while True:
try:
path = input("****请输入数据的路径,或者输入expiry退出程序:")
"""for i in os.listdir(path):
if i == "real":
rename(path)
else:
attack_pic(path)"""
except Exception as msg:
print(str(msg))
except KeyboardInterrupt as msg:
print(msg)
else:
if path == 'expiry':
break
data_list = os.listdir(path)
if data_list:
print("正在重名命,请稍等!!!")
for data_dir in data_list:
data_type = data_dir.split('_')[0]
if data_type == "real":
rename(path)
else:
attack_pic(path)
break
print("************重名命完成*****************")
else:
print("*******该文件目录为空", end='')
except Exception as msg:
print(repr(msg))
总结:这是个整体的思路,可以参考,本段可以直接运行,适应批量重名命,应对自己的需求,进行修改