简介
因工作需求,需要将很多的巡检记录单进行扫描后导出为pdf的文件格式,然后还要对文件名称进行修改为固定的某种格式,且格式中的日期要与文件内容中的日期相对应。由于文件较多,大概有2年多文件,修改起文件名非常耽误时间,影响鄙人学习其他知识,故有此想法。此工具只适合特定的场景,并不是所有场景都适用,具体情况具体分析,可进行代码修改。此工具针对具有顺序的文件,如
实现原理
首先将此目录下的文件名遍历出来,然后对遍历的文件名进行正则匹配,提取数字编号,随后将文件进行重命名,然后再次对此目录下的文件进行遍历,排序,修改为需要的文件名。
源码
import os #导入模块
import re
path = 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 = 0
for 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+=1
print('修改完毕')
总结
我这里的代码对文件名进行了两此修改才得以实现,暂时实在是想不出来其他方法,这里还有一个大坑需要避免,网上大部分文章在使用匿名函数的时候,用了int()这个函数,get_key = lambda i : int(i.split('.')[0])
进行了强制转换为数字类型,这就导致了你的文件名如果有除数字的其他字符串就会导致报错,也就无法进行排序。为什么会乱序那,因为os模块中的listdir()函数在打印时的规律为1 10 11 12 13 2 21 22 23
,所以导致会乱序;那么我们这里就要将字符串拿掉,只保留数字位;这样我们才可以进行排序。