[Github Star多的py代码鉴赏学习]目录下文件重命名脚本

来源

batch_file_rename.py

解析

1.程序入口

if __name__ == '__main__':
main()

2.使用模块

import os
import argparse

OS模块 是一个Python的系统编程的操作模块,可以处理文件和目录等日常操作,可以输入help(os)查看详细的说明和使用介绍。
argparse模块 能对命令行参数进行解析,在使用这个脚本时需要带参数,这个模块就是解析从终端传进来的参数。其用法资料很多,之后碰到再补充。

2.Main方法内容

def main():
    '''
    This will be called if the script is directly invoked.
    '''
    # adding command line argument
    parser = get_parser()
    args = vars(parser.parse_args())

    # Set the variable work_dir with the first argument passed
    work_dir = args['work_dir'][0]
    # Set the variable old_ext with the second argument passed
    old_ext = args['old_ext'][0]
    if old_ext[0] != '.':
        old_ext = '.' + old_ext
    # Set the variable new_ext with the third argument passed
    new_ext = args['new_ext'][0]
    if new_ext[0] != '.':
        new_ext = '.' + new_ext
    batch_rename(work_dir, old_ext, new_ext)

可以看到内容很少

parser = get_parser() 调用了一个自定义的方法,get_parser的返回值是一个解析处理器,就是之前说的argparse模块里的东西

看看这个自定义方法

def get_parser():
    parser = argparse.ArgumentParser(description='change extension of files in a working directory')
    parser.add_argument('work_dir', metavar='WORK_DIR', type=str, nargs=1, help='the directory where to change extension')
    parser.add_argument('old_ext', metavar='OLD_EXT', type=str, nargs=1, help='old extension')
    parser.add_argument('new_ext', metavar='NEW_EXT', type=str, nargs=1, help='new extension')
return parser

第一行生成了一个解析处理器,带有描述
第二、三、四行将参数添加进处理器里面,参数依次是,Key,命令行参数,参数类型,命令行应该消耗的参数数量,帮助上的说明

实际调用的时候注意 python 1.py /home/yg/code/python/test/1/imgs .jpeg .jpg 参数按顺序写,不要写WORK_DIR=/home/yg/code/python/test/1/imgs 这样的。不知道具体什么原因,argparse没用过,有知道的大神在评论里解释下,万分感谢。

args = vars(parser.parse_args()) 这句将获取的参数值存成字典调用
work_dir = args['work_dir'][0] 获取路径参数,从上面可以知道,所有的参数值都是str型

获取现扩展名,如果输入的扩展名没有带.字符 就加上去 ,新扩展名同理

old_ext = args['old_ext'][0] 
if old_ext[0] != '.':
    old_ext = '.' + old_ext

最后调用修改方法

batch_rename(work_dir, old_ext, new_ext)
def batch_rename(work_dir, old_ext, new_ext):
    '''
    This will batch rename a group of files in a given directory,
    once you pass the current and new extensions
    '''
    # files = os.listdir(work_dir)
    for filename in os.listdir(work_dir):
        # Get the file extension
        split_file = os.path.splitext(filename)
        file_ext = split_file[1]
        # Start of the logic to check the file extensions, if old_ext = file_ext
        if old_ext == file_ext:
            # Returns changed name of the file with new extention
            newfile = split_file[0] + new_ext 

            # Write the files
            os.rename(
                os.path.join(work_dir, filename),
                os.path.join(work_dir, newfile)
)

思路很简单,首先拿到第一个行参传进来的文件目录下的所有文件名
使用os.path.splitext(filename)将名字拆成文件名和扩展名存在split_file里
split_file[0]是文件名 split_file[1]是扩展名(带点的)
循环比较文件的扩展名是否是需要被替换的
如果是那文件名与新扩展名加在一起生成新文件
然后执行os.rename()把work_dir\filename,替换成work_dir\newfile。

拓展

写了个类似的,批量重命名脚本,主要是因为是为相机里导出的图片命名,采用可与上面不同的命令行参数处理方法,getopt模块,比较好读懂些,可以-h -i这样调用,比较习惯这种的。用的都是常见模块,所以不做解析了,楼主自学,有写错或是说错的 还请各位留言告知,先谢谢啦。

import os
import getopt, sys

def rename(work_dir, new_name, start_index):
    for filename in os.listdir(work_dir):
        split_file = os.path.splitext(filename)
        file_ext = split_file[1]

        newfile = new_name+str(start_index)+file_ext

        os.rename(
            os.path.join(work_dir, filename),
            os.path.join(work_dir, newfile)
        )
        start_index = start_index+1

def main():
    opts, args = getopt.getopt(sys.argv[1:], "hd:i:n:", ["help=", "work_dir=", "start_index=", "new_name="])
    work_dir = ""
    new_name = "default"
    start_index = 0
    def usage():
        print("""
        -h --help                 print the help
        -d --work_dir             work_dir
        -n --new_name             new_name
        -i --start_index           start_index
        """)
    for op, value in opts:
        if op in ("-d","--work_dir"):
            work_dir = value
        elif op in ("-i","--start_index"):
            start_index = int(value)
        elif op in ("-n","--new_name"):
            new_name = value
        elif op in ("-h"):
            usage()
            sys.exit()

    rename(work_dir, new_name, start_index)
if __name__ == '__main__':
        main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值