2021-11-04

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("************重名命完成*****************")

扩展

  1. 可以加入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))

总结:这是个整体的思路,可以参考,本段可以直接运行,适应批量重名命,应对自己的需求,进行修改

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值