简介
因工作需求,需要将很多的巡检记录单进行扫描后导出为pdf的文件格式,然后还要对文件名称进行修改为固定的某种格式,且格式中的日期要与文件内容中的日期相对应。由于文件较多,大概有2年多文件,修改起文件名非常耽误时间,影响鄙人学习其他知识,故有此想法。此工具只适合特定的场景,并不是所有场景都适用,具体情况具体分析,可进行代码修改。此工具针对具有顺序的文件,如
实现原理
首先将此目录下的文件名遍历出来,然后对遍历的文件名进行正则匹配,提取数字编号,随后将文件进行重命名,然后再次对此目录下的文件进行遍历,排序,修改为需要的文件名。
源码
import os #导入模块import repath = input("请输入文件夹路径:")year = input("请输入年和月份:")#修改文件名为纯数字格式def renameall(): #定义函数fileList = os.listdir(path) #待修改文件夹print("修改前:"+str(fileList)) #输出文件夹中包含的文件os.chdir(path) #将当前工作目录修改为待修改文件夹的位置num=1 #名称变量for fileName in fileList: #遍历文件夹中所有文件pattern = re.findall(r'\d+',fileName) #进行匹配os.rename(fileName,(pattern[0])+'.'+'pdf') #文件重新命名num = num+1 #改变编号,继续下一项print("---------------------------------------------------")print("修改后:"+str(os.listdir(r"C:\\Users\\Desktop\\test"))) #输出修改后文件夹中包含的文件renameall() #调用函数#将生成的数字格式的文件重新排序后再次重命名#设定文件路径path='C:\\Users\\Desktop\\test'#获取该目录下所有文件,存入列表中filelist = os.listdir(path)#对目录中的文件只提取数字,然后进行排序get_key = lambda i : int(i.split('.')[0])new_sort = sorted(filelist, key=get_key)#循环遍历目录下的内容n = 0for i in filelist:#设置旧文件名oldname = path + os.sep + new_sort[n]print(oldname)#设置新文件名newname = path + os.sep + year + str(n+1) + '日机房日常巡检表' + '.pdf'os.rename(oldname,newname)print(oldname,'====>',newname)n+=1print('修改完毕')
总结
我这里的代码对文件名进行了两此修改才得以实现,暂时实在是想不出来其他方法,这里还有一个大坑需要避免,网上大部分文章在使用匿名函数的时候,用了int()这个函数,get_key = lambda i : int(i.split('.')[0])进行了强制转换为数字类型,这就导致了你的文件名如果有除数字的其他字符串就会导致报错,也就无法进行排序。为什么会乱序那,因为os模块中的listdir()函数在打印时的规律为1 10 11 12 13 2 21 22 23,所以导致会乱序;那么我们这里就要将字符串拿掉,只保留数字位;这样我们才可以进行排序。
