日常工作中经常会遇到这样的情况,需要将某个文件夹下的文件按着一定的规则进行重命名,当文件数量及其庞大的时候手工一个一个的去修需要耗费大量的时间,以下python工具可以协助批量修改文件名。
场景:某文件夹下由多种不同后缀类型的文件组成,先将后缀均为.mdb的所有文件更改为python01.mdb,python02.mdb...
代码部分:
import os prefix = 'python' # prefix 为文件重命名后的起始字符 length = 2 # length为去除prefix后文件名要达到的长度 base = 1 # 文件名的起始数 format = 'mdb' # 需要重命名什么后缀的文件 # 函数PadLeft的作用是将文件名补充到指定长度 # str代表要补全的字符 # num代表要达到的长度 # padstr代表到达长度需要添加的字符 def PadLeft(str,num,padstr): #计算传入字符当前的长度 stringlength = len(str) # 用标准长度 - 当前长度得出n,n为待补全的位数 n = num - stringlength # 如果n>=0,代表需要补全一定的位数 if n >= 0: # 使用padstr * n + str后可以得到指定的长度 str = padstr * n + str return str # 为避免误操作,提示用户 print('the files in [%s] will be renamed!' % os.getcwd()) # 获取当前目录的所有文件并打印 allfiles = os.listdir(os.getcwd()) print([f for f in allfiles if os.path.isfile(f)]) # 确认用户是否按'y'继续,否则直接exit()退出。 input = input('please press \'y\' to continue:') if input.lower() != 'y' : exit() # 获取当前位置的所有文件名,保存在列表filenames中 filenames = os.listdir(os.curdir) i = base -1 # for循环遍历filenames里面的文件名 for filename in filenames: i = i+1 # 判断当前路径是否为文件,并且不是rename.py if filename != 'rename.py' and os.path.isfile(filename): # 将i转换为字符串,i的初始值为1 name = str(i) # 使用PadLeft函数将文件名后缀补充到指定长度 name = PadLeft(name,length,'0') # split分割后的内容以['a11_3', 'py']的形式保存给列表t,分割文件名同时检查是否是需要修改的类型 t = filename.split('.') m = len(t) # 如果未指定文件后缀,则更改当前目录下所有的文件 if format == '': os.rename(filename,prefix+name+'.'+t[m-1]) else: # 否则如果文件后缀等于format,也就是'mdb'的时候,执行对该文件的重命名 # filename重命名由3部分组成,即prefix(python)+name(01,02...)+'.'+t[m-1] (后缀mdb) if t[m-1] == format: os.rename(filename,prefix+name+'.'+t[m-1]) else: i = i -1 # 保证i连续 else: i = i - 1 # 保证i连续 # 获取重命名后的文件列表并打印 allfiles = os.listdir(os.getcwd()) print([f for f in allfiles if os.path.isfile(f)])
执行结果:
the files in [/Users/pentest/PycharmProjects/python_basic/python教程/文件与文件系统/批量重命名文件名] will be renamed! ['a.mdb', 'a11_3.py', 'a11_4.py', 'ab.mdb', 'ae.mdb', 'b.mdb', 'c.mdb', 'rename.py'] please press 'y' to continue:y ['a11_3.py', 'a11_4.py', 'python01.mdb', 'python02.mdb', 'python03.mdb', 'python04.mdb', 'python05.mdb', 'rename.py']
更改前:
['a.mdb', 'a11_3.py', 'a11_4.py', 'ab.mdb', 'ae.mdb', 'b.mdb', 'c.mdb', 'rename.py']
更改后:
['a11_3.py', 'a11_4.py', 'python01.mdb', 'python02.mdb', 'python03.mdb', 'python04.mdb', 'python05.mdb', 'rename.py']