简介
最近在做一些目标检测的工作,但是找到的数据集有一万多张图片,而且图片每张照片的名字都是乱的,这在后面的数据集的预处理上面就会遇到很多的麻烦,于是就想到利用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)