- 论坛徽章:
- 0
|
转:John Smith
Python - 批量文件重命名
两个目标两个:
1. 输入一组文件名,进行批量重命名;
2. 输入一组目录名,批量重命名各个目录下的文件。
附加功能:
1. 可根据文件的创建日期对文件重新排序;
2. 重命名方式为递增数列,可带前后缀;
3. 可以指定输出目录,如果不指定输出目录,则在原文件夹中重命名,默认为在原文件夹中进行重命名;
4. 可指定在重命名后删除原文件(只有输出目录不同时有效),默认为不删除。
代码:- import os# 获取目录下的子目录
- def subdirs(path):
- dl = [];
- for i in os.walk(path, False):
- for d in i[1]:
- dl.append(os.path.join(path, d))
- return dl# 获取目录下的子文件def subfiles(path):
- fl = [];
- for i in os.walk(path, False):
- for f in i[2]:
- fl.append(os.path.join(path, f))
- return fl# 根据文件创建时间对文件进行排序
- def fsort(files):
- files.sort(key = lambda s: os.path.getctime(s))
- return files# 递增数列生成器class gen:
- def __init__(self, prefix = '', suffix = '', seed = 1, digit = 3):
- self.prefix = prefix
- self.suffix = suffix
- self.seed = seed
- self.digit = digit
- self.it = seed - 1
- def gennext(self):
- self.it += 1
- return '{0}{1:0{3}d}{2}'.format(self.prefix, self.it, self.suffix, self.digit)
- def copy(self):
- return gen(self.prefix, self.suffix, self.seed, self.digit)class renamer:
- def __init__(self, files, ngen = None, delsrc = False, output = ''):
- self.it = 0
- self.total = 0
- self.files = files
- self.delsrc = delsrc
- self.target = output
- if(ngen is None): self.namegen = gen()
- elif(isinstance(ngen, gen)): self.namegen = ngen
- else: raise(TypeError, 'ngen参数只接受gen类型的对象')
- def rename(src, des, delsrc):
- os.rename(src, des)
- if(delsrc == True):
- os.remove(src)
- def run(self):
- self.it = 0
- self.total = len(self.files)
- for f in self.files:
- dn = os.path.dirname(f)
- ex = os.path.splitext(f)
- nn = self.namegen.gennext() + ex[1]
- np = '' sd = self.target == ''
- if(sd):
- np = os.path.join(dn, nn)
- else:
- np = os.path.join(self.target, nn)
- print('rename: %s' %(np))
- renamer.rename(f, np, sd and self.delsrc)
- self.it += 1
- print('%d work(s) done' %(self.it))
- print()
- # 重命名给定列表中的所有文件
- def fs_rename(files, resort = False, ngen = gen(), delsrc = False, output = ''):
- if(resort): fsort(files)
- rn = renamer(files, ngen.copy(), delsrc, output)
- rn.run()
- # 重命名给定目录中的所有文件
- def ds_rename(dirs, resort = False, ngen = gen(), delsrc = False, output = ''):
- for d in dirs:
- fs = subfiles(d)
- if(resort): fsort(fs)
- print('%d file(s) in %s' %(len(fs), d))
- if(output == '') ngen = ngen.copy()
- rn = renamer(fs, ngen, delsrc, output)
- rn.run()
复制代码 说明
fs_rename方法对一组文件进行批量重命名。
参数说明:
files: 文件列表;
resort: 是否重新排列文件(按创文件建时间),默认为False;
ngen: 一个gen类型的对象,用于产生文件名;
delsrc: 是否删除原文件,默认为False;
output: 输出路径,默认为'',表示在原文件家中重命名。
ds_rename方法对一组目录中的文件进行批量重命名。
参数说明:
dirs: 目录列表;
resort: 是否重新排列文件(按创文件建时间),默认为False;
ngen: 一个gen类型的对象,用于产生文件名;
delsrc: 是否删除原文件,默认为False;
output: 输出路径,默认为'',表示在原文件家中重命名。
gen类型构造函数创建数列发生器。
参数说明:
prefix: 前缀字符串;
suffix: 后缀字符串;
seed: 起始数;
digit: 数为宽,不够用0补齐。
subdirs方法获取一个目录下的子目录,并返回完整路径。
subfiles方法获取一个目录下的所有文件,并返回完整路径。
fsort方法对一组文件根据其创建时间进行重新排序。 |
|