利用Python快速批量修改数据集文件名

简介

最近在做一些目标检测的工作,但是找到的数据集有一万多张图片,而且图片每张照片的名字都是乱的,这在后面的数据集的预处理上面就会遇到很多的麻烦,于是就想到利用python写一个脚本,帮助批量的修改文件名——按照一定的顺序生成文件名修改。

用到的工具-os模块

我们要修改名字,主要是文件目录的操作,所以肯定是避免不了os这个库。修改思路就是:进入到目标下,修改要生成的文件名的格式就好了。

代码:

# -*- coding: utf-8 -*-
import os

# (os.path.abspath('.')  打印绝对路径
# os.path.join(a, b) --> a/b   拼接路径
# os.path.split(a/b) --> 这样可以把一个路径拆分为两部分,
#                       后一部分总是最后级别的目录或文件名
# os.path.splitext() -->得到文件拓展名
# os.rename()   --> 对文件重命名
# os.remove() --> 删除文件
# os.path.dirname() -->获取文件或文件夹的路径
# os.path.isfile/os.path.isdir() -->确认是文件或者文件夹
# os.walk() -->遍历目录,return (dirpath, dirnames, filenames).
#              dirpath 是以 string 字符串形式返回该目录下所有的绝对路径;
#              dirnames 是以列表 list 形式返回每一个绝对路径下的文件夹名字;
#              filesnames 是以列表 list 形式返回该路径下所有文件名字。

def modi_dataname(dirpath):
    '''
        从00000开始依次加一,如00000.jpg
    '''
    length = 0
    filesnames = []
    for dirpath, dirnames, filesnames in os.walk(dirpath):
        length = len(filesnames)               #获取数据集的图片个数
        # print(length)
    for i in range(length):
        num = str(i).zfill(5)
        filename = "fire_" + num                        #修改文件名的格式
        scrfilename = dirpath + "\\" + filesnames[i]           #修改前的文件名
        nowfilename = dirpath + "\\" + filename + ".jpg"       #修改的文件名
        # print("修改前的文件名", scrfilename)
        # print("修改后的文件名", nowfilename)
        try:
           os.rename(scrfilename,nowfilename)
        except Exception as e:
           print('rename file fail\r\n')
        else:
           print('rename file successfullly\r\n')
    
if __name__ == '__main__':
    path = os.path.abspath('.')
    # print(path)
    modi_dataname(path)

如果要修改的文件名的话就修改filename就好了。在命令行直接python运行就可以了。

优化

后面想着,每次都要进入修改文件名都要修改源码,那我们能不能直接在命令行修改呢,实际上是可以的,利用sys命令行传参:

代码:

# -*- coding: utf-8 -*-
import os
import sys

# (os.path.abspath('.')  打印绝对路径
# os.path.join(a, b) --> a/b   拼接路径
# os.path.split(a/b) --> 这样可以把一个路径拆分为两部分,
#                       后一部分总是最后级别的目录或文件名
# os.path.splitext() -->得到文件拓展名
# os.rename()   --> 对文件重命名
# os.remove() --> 删除文件
# os.path.dirname() -->获取文件或文件夹的路径
# os.path.isfile/os.path.isdir() -->确认是文件或者文件夹
# os.walk() -->遍历目录,return (dirpath, dirnames, filenames).
#              dirpath 是以 string 字符串形式返回该目录下所有的绝对路径;
#              dirnames 是以列表 list 形式返回每一个绝对路径下的文件夹名字;
#              filesnames 是以列表 list 形式返回该路径下所有文件名字。

def modi_dataname(dirpath):
    '''
        从00000开始依次加一,如00000.jpg
        可以从命令行读取参数实现任意修改任何名字
        python modi_dataname.py [width] [name=string]
    '''
    args = sys.argv
    width = int(args[1])
    length = 0
    filesnames = []
    for dirpath, dirnames, filesnames in os.walk(dirpath):
        length = len(filesnames)               #获取数据集的图片个数
        print(length)
    for i in range(length):
        num = str(i).zfill(width)
        filename = args[2] + num                        #修改文件名的格式
        scrfilename = dirpath + "\\" + filesnames[i]           #修改前的文件名
        nowfilename = dirpath + "\\" + filename + ".jpg"       #修改的文件名
        print("修改前的文件名", scrfilename)
        print("修改后的文件名", nowfilename)
        try:
           os.rename(scrfilename,nowfilename)
        except Exception as e:
           print('rename file fail\r\n')
        else:
           print('rename file successfullly\r\n')
    
if __name__ == '__main__':
    path = os.path.abspath('.')
    # print(path)
    modi_dataname(path)
效果图

在这里插入图片描述
使用的话,先切换到文件目录下,在命令行直接用 python path/modi_filename.py [width] [name]

参数说明:

  • width: 数字的长度
  • name: 文件名
  • 最后修改后的文件名是:name+width长度的数字,比如 2 FILE_ --> FILE_00.jpg 这样的名字

再次优化

后来看着可以用argparse这个库,可以实现命令行选项,所以试了一下,用法和上面是一样的:

# -*- coding: utf-8 -*-
import os
import sys
import argparse

# (os.path.abspath('.')  打印绝对路径
# os.path.join(a, b) --> a/b   拼接路径
# os.path.split(a/b) --> 这样可以把一个路径拆分为两部分,
#                       后一部分总是最后级别的目录或文件名
# os.path.splitext() -->得到文件拓展名
# os.rename()   --> 对文件重命名
# os.remove() --> 删除文件
# os.path.dirname() -->获取文件或文件夹的路径
# os.path.isfile/os.path.isdir() -->确认是文件或者文件夹
# os.walk() -->遍历目录,return (dirpath, dirnames, filenames).
#              dirpath 是以 string 字符串形式返回该目录下所有的绝对路径;
#              dirnames 是以列表 list 形式返回每一个绝对路径下的文件夹名字;
#              filesnames 是以列表 list 形式返回该路径下所有文件名字。

def modi_dataname(dirpath):
    '''
        从00000开始依次加一,如00000.jpg
        可以从命令行读取参数实现任意修改任何名字
        python modi_dataname.py [width] [name=string]
    '''
    parser = argparse.ArgumentParser(description="change filename of files in a working directory, filename-->[name]+[the default width of num].jpg")
    parser.add_argument('--width', type=int, default=3, help="the width of num")
    parser.add_argument('--front_name', type=str, default='name', help="the front name")
    args = parser.parse_args()
    
    width = args.width
    font_name = args.front_name
    length = 0
    filesnames = []
    for dirpath, dirnames, filesnames in os.walk(dirpath):
        length = len(filesnames)               #获取数据集的图片个数
        print(length)
    for i in range(length):
        num = str(i).zfill(width)
        filename = font_name + num                        #修改文件名的格式
        scrfilename = dirpath + "\\" + filesnames[i]           #修改前的文件名
        nowfilename = dirpath + "\\" + filename + ".jpg"       #修改的文件名
        print("修改前的文件名", scrfilename)
        print("修改后的文件名", nowfilename)
        try:
           os.rename(scrfilename,nowfilename)
        except Exception as e:
           print('rename file fail\r\n')
        else:
           print('rename file successfullly\r\n')
    
if __name__ == '__main__':
    path = os.path.abspath('.')
    # print(path)
    modi_dataname(path)
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值