简介

因工作需求,需要将很多的巡检记录单进行扫描后导出为pdf的文件格式,然后还要对文件名称进行修改为固定的某种格式,且格式中的日期要与文件内容中的日期相对应。由于文件较多,大概有2年多文件,修改起文件名非常耽误时间,影响鄙人学习其他知识,故有此想法。此工具只适合特定的场景,并不是所有场景都适用,具体情况具体分析,可进行代码修改。此工具针对具有顺序的文件,如
image.png

实现原理

首先将此目录下的文件名遍历出来,然后对遍历的文件名进行正则匹配,提取数字编号,随后将文件进行重命名,然后再次对此目录下的文件进行遍历,排序,修改为需要的文件名。

源码

  1. import os #导入模块
  2. import re
  3. path = input("请输入文件夹路径:")
  4. year = input("请输入年和月份:")
  5. #修改文件名为纯数字格式
  6. def renameall(): #定义函数
  7. fileList = os.listdir(path) #待修改文件夹
  8. print("修改前:"+str(fileList)) #输出文件夹中包含的文件
  9. os.chdir(path) #将当前工作目录修改为待修改文件夹的位置
  10. num=1 #名称变量
  11. for fileName in fileList: #遍历文件夹中所有文件
  12. pattern = re.findall(r'\d+',fileName) #进行匹配
  13. os.rename(fileName,(pattern[0])+'.'+'pdf') #文件重新命名
  14. num = num+1 #改变编号,继续下一项
  15. print("---------------------------------------------------")
  16. print("修改后:"+str(os.listdir(r"C:\\Users\\Desktop\\test"))) #输出修改后文件夹中包含的文件
  17. renameall() #调用函数
  18. #将生成的数字格式的文件重新排序后再次重命名
  19. #设定文件路径
  20. path='C:\\Users\\Desktop\\test'
  21. #获取该目录下所有文件,存入列表中
  22. filelist = os.listdir(path)
  23. #对目录中的文件只提取数字,然后进行排序
  24. get_key = lambda i : int(i.split('.')[0])
  25. new_sort = sorted(filelist, key=get_key)
  26. #循环遍历目录下的内容
  27. n = 0
  28. for i in filelist:
  29. #设置旧文件名
  30. oldname = path + os.sep + new_sort[n]
  31. print(oldname)
  32. #设置新文件名
  33. newname = path + os.sep + year + str(n+1) + '日机房日常巡检表' + '.pdf'
  34. os.rename(oldname,newname)
  35. print(oldname,'====>',newname)
  36. n+=1
  37. print('修改完毕')

总结

我这里的代码对文件名进行了两此修改才得以实现,暂时实在是想不出来其他方法,这里还有一个大坑需要避免,网上大部分文章在使用匿名函数的时候,用了int()这个函数,get_key = lambda i : int(i.split('.')[0])进行了强制转换为数字类型,这就导致了你的文件名如果有除数字的其他字符串就会导致报错,也就无法进行排序。为什么会乱序那,因为os模块中的listdir()函数在打印时的规律为1 10 11 12 13 2 21 22 23,所以导致会乱序;那么我们这里就要将字符串拿掉,只保留数字位;这样我们才可以进行排序。