python短时间内大批量修改文件?讲真,这很快活!
作者:互联网
安老师最近在工作中遇到一件重复繁琐的小任务。这个任务需要修改几百个Word文件的文件名,而且都有固定的格式。我按照以往的习惯,不断地右键点击重命名,然后复制粘贴修改。
突然,我看到屏幕右下角出现了"贪玩某月",咦!他们能肆无忌惮地开挂,难道我就不能用python开挂吗?于是乎,我拿起手中的python屠龙刀,编程磨刀霍霍向"文件"... ...
通过实战积累了一些经验,下面我就开始为大家介绍如何在短时间内替换文件夹名和替换文件名以及替换文件中的内容。
大纲
1. os模块和open模块
2. 替换演示
1 替换文件夹名
2 替换文件名
3 替换文件内容
01
os模块和open模块
1. os模块
2. open模块
2.1 打开文件
2.2 文件的对象方法
2.3 关闭文件
使用close()方法即可关闭文件。若是C语言,安老师一定要强调关闭文件的重要性。但Python拥有垃圾收集机制,会在文件对象的引用计数降至零的时候自动关闭文件,故在python里忘记关闭文件不会造成内存泄露这么危险的结果。为了避免python因断电之类的事故丢失缓存数据(尚未写入文件),我们要养成使用完文件后,立刻关闭的好习惯!
02
替换演示
1. 演示场景
本次默认Windows查找文件,演示的图片如下
1.1 替换文件夹和替换文件名
主目录:F:\python\演示\流浪地球计划
子目录:F:\python\演示\流浪地球计划\第X阶段任务
1.2 替换文件内容
主目录:F:\python\演示\流浪地球计划
子目录:F:\python\演示\流浪地球计划\总计划
2. 替换文件夹名
1import os
2def replaceDirName(rootDir,oldStr,newStr):
3 for dirpath,dirNames,fileNames in os.walk(rootDir,topdown=True):
4 for dirName in dirNames:
5 if oldStr in dirName:
6 dirNameOld = os.path.join(dirpath,dirName)
7 dirNameNew = os.path.join(dirpath,dirName.replace(oldStr,newStr))
8 print(dirNameOld + '-->' + dirNameNew)
9 os.rename(dirNameOld,dirNameNew)
10
11if __name__ == '__main__':
12 try:
13 rootDir = r"F:\python\演示\流浪地球计划\\"
14 oldStr = "第X阶段"
15 newStr = "第一阶段"
16 replaceDirName(rootDir,oldStr,newStr)
17 pass
18 except Exception as e:
19 print(e)2. 替换文件名
2.1 重点代码详解
1)执行流
rootDir:根目录(即需要查找的目录)
oldStr:原字符串
newStr:新字符串
2)第3行 topdown:默认为True,则优先遍历top目录;若topdown为False,则优先遍历top的子目录。
3)第9行 os.rename 请见上方os模块详解。
2.2 重命名文件夹优缺点
优点:短时间内修改大批量具有相同字符串的文件夹名。
缺点:在实际场景中用的比较少。
2.3 执行演示
从最下面的子目录往上替换,如果从主目录往下替换,那就有意思啦,因为主目录变了,子目录的路径肯定也会变,也就无法进行重命名了!
3. 替换文件名
1import os
2def replaceFileName(rootDir,oldStr,newStr):
3 for dirpath,dirNames,fileNames in os.walk(rootDir):
4 for fileName in fileNames:
5 if oldStr in fileName:
6 fileNameOld = os.path.join(dirpath,fileName)
7 fileNameNew = os.path.join(dirpath,fileName.replace(oldStr,newStr))
8 print(fileNameOld + '-->' + fileNameNew)
9 os.rename(fileNameOld,fileNameNew)
10
11if __name__ == '__main__':
12 try:
13 rootDir = r"F:\python\演示\流浪地球计划\\"
14 oldStr = "第一阶段"
15 newStr = "初始阶段"
16 replaceFileName(rootDir,oldStr,newStr)
17 pass
18 except Exception as e:
19 print(e)
3.1 重点代码详解
无
3.2 替换文件名优缺点
优点:在当前目录中,替换具有相同字符串的文件名非常高效。
缺点:若在非当前目录(子目录和文件可能较多),只要符合字符串,均会被替换。
3.3 执行演示
无论是当前目录还是子目录,符合字符串的文件名均会被新字符串替换。
4. 替换文件内容
1# -*- coding: GB18030 -*-
2import os
3def replaceFileContent(rootDir,oldStr,newStr):
4 for dirpath,dirNames,fileNames in os.walk(rootDir):
5 for fileName in fileNames:
6 fileObj = os.path.join(dirpath,fileName)
7 try:
8 #f = open(fileObj,'r+',encoding='GB18030')
9 f = open(fileObj, 'r+')
10 allLines = f.readlines()
11 f.seek(0)
12 f.truncate()
13 for line in allLines:
14 f.write(line.replace(oldStr,newStr))
15 f.close()
16 print(fileObj +' 由 ' +oldStr+'-->'+ newStr +' 替换成功')
17 pass
18 except Exception as e:
19 print(fileObj+'替换失败!')
20 print('原因:',e)
21
22if __name__ == '__main__':
23 try:
24 rootDir = r"F:\python\演示\流浪地球计划\\"
25 oldStr = "2019"
26 newStr = "2018"
27 replaceFileContent(rootDir,oldStr,newStr)
28 pass
29 except Exception as e:
30 print(e)
4.1 重点代码详解
1)第7行和第18行 尝试打开文件,若成功执行try剩下的部分,若不成功,则执行except处理异常。
2)第8行 encoding='GB18030',使用该方式可以打开文件,通过这种方式打开Word类文件不会报错,但文件会损坏,无法继续使用。
3)第9行 以"r+"模式,可读写方式打开。
4)第11行 f.seek(0) 代表指针在文件内容的起始位置。
5)第12行 f.truncate() 清空文件内容。
6)第14行 f.write(line.replace(oldStr,newStr)) 写入字符串,有对应的字符串就会被替换,如无对应的字符串就按照原样输出。
4.2 替换文件内容优缺点
优点:在实际工作环境替换已经确定的目标文件且是文本格式的文件非常有效。
缺点:若在非当前目录(子目录和文件可能较多),只要符合字符串,文件内容均被替换,可能会替换重要的数据,造成混乱甚至不可挽回的结果。
4.3 执行演示
一般Uedit和nodepad++能打开的文件都可以被成功替换,但是像Word、Excel、PPT就无法被替换,如果强行替换,反而会损坏文件。这三类文件都需要使用对应的工具才可以进行操作。
总结
python大批量修改文件,只要用在合适的场合上,就能为我们高效完成重复繁琐的工作!前提是我们要确认好这个替换的风险,是否能够快速回退!如果我们不考虑回退方案,有可能会造成很大的损失。比如,生产环境的oracle数据库软件目录不小心被替换了,这不就要gg了吗?标签:文件,oldStr,python,讲真,newStr,大批量,os,替换 来源: https://blog.51cto.com/15061934/2653784