当前位置:   article > 正文

使用python进行文本替换(包括替换文件名、文件夹名、文本名)_filename.replace

filename.replace

目录

一、需求分析

二、细节要点

三、代码

四、总结


一、需求分析

总体概述:替换

  1. 文件名称的替换

如果文件夹或文本文件(各类后缀文件)的名称中存在某个字符串,则将他替换为另外的字符串。

  1. 文件内容的替换

如果文本文件(各类后缀文件)的内容中存在某个字符串,则将他替换为另外的字符串。


二、细节要点

需要替换的是给定文件夹下面的所有文件。

  1. 文件是多层级的。(文件夹下面有文件夹有各类文本文件,级数不确定,文件个数有多有少,这里我们就需要使用递归)
  2. 指定某一类或几类的文件不替换内容。(比如:指定以.png结尾的文件只改名称不该内容)
  3. 需要替换的字符串以字典的形式传入,键为:将要修改的字符串,值为:替换后的字符串。
  4. 不替换文本内容的文本类型以元组的形式传入。
  5. 自定义函数实现,传入三个参数,分别为文件路径、需要替换字符串的字典、那些文本类型不替换内容的元组。三

 


三、代码

详细请看代码注释

  1. import os
  2. import chardet
  3. import time
  4. class replace:
  5. path = ""
  6. dict_repalce = {}
  7. tuple_notreplace = ()
  8. def __init__(self,p,d,t):
  9. self.path = p
  10. self.dict_replace = d
  11. self.tuple_notreplace = t
  12. def replace(self):
  13. if os.path.isdir(self.path): # 判断是否是一个文件夹
  14. li_os = os.listdir(self.path) # 返回一个文件节的列表
  15. for every_dir in li_os: # 循环判断每一个是否是文件夹
  16. filePath = os.path.join(self.path,every_dir)
  17. if os.path.isdir(filePath): # 如果是一个文件夹
  18. print(filePath,"这是一个文件夹")
  19. filename = os.path.basename(filePath)
  20. bool_change = False #判断文件名是否更改的标志
  21. for key in self.dict_replace.keys(): # 循环查看key
  22. if key in filename: # 查看key是不是存在文件名的一部分
  23. filename_new = filename.replace(key,self.dict_replace[key])
  24. bool_change = True #文件名被更改
  25. if bool_change == True: #判断文件名是否被修改
  26. print(filename,"正在修改文件夹名。。。")
  27. os.chdir(os.path.dirname(filePath)) #修改工作路径
  28. os.rename(os.path.basename(filePath),filename_new)#修改文件名
  29. filePath = os.path.abspath(filename_new)
  30. print(filename_new,"文件夹名修改成功。。。")
  31. replace(filePath,self.dict_replace,self.tuple_notreplace).replace()
  32. else:
  33. print(filePath,"这是一个文件")
  34. filename = os.path.basename(filePath)
  35. filename_li = filename.split('.')#分割,防止在修改文件名的时候把文件格式后缀一起修改了
  36. bool_change = False #判断文件名是否更改的标志
  37. for key in self.dict_replace.keys(): # 循环查看key
  38. if key in filename_li[0]: # 查看key是不是存在文件名的一部分
  39. filename_li[0] = filename_li[0].replace(key,self.dict_replace[key])
  40. bool_change = True #文件名被更改
  41. if bool_change == True: #判断文件名是否被修改
  42. filename_new = '.'.join(filename_li)#连接名称
  43. print(filename,"正在修改文件名。。。")
  44. os.chdir(os.path.dirname(filePath)) #修改工作路径
  45. os.rename(os.path.basename(filePath),filename_new)#修改文件名
  46. filePath = os.path.abspath(filename_new)
  47. print(filename_new,"文件名修改成功。。。")
  48. for notreplace in self.tuple_notreplace: # 循环不能更改内容的元组
  49. if os.path.basename(filePath).endswith(notreplace): # 判断是不是不能更改类型的文件
  50. print("文件内容没有修改。。。。")
  51. break
  52. else:
  53. print("文件内容正在修改。。。。")
  54. code = chardet.detect(open(filePath,'rb').read())['encoding']#获取文件编码
  55. print('编码格式',code)
  56. with open(filePath,errors='ignore',encoding=code) as f:#以自己的编码格式打开文件
  57. file_str = f.read()
  58. for key in self.dict_replace.keys(): # 循环查看key
  59. if key in file_str: # 查看key是不是存在文件名的一部分
  60. file_str = file_str.replace(key,self.dict_replace[key])
  61. with open(filePath,'w',encoding=code) as f:
  62. f.write(file_str)
  63. print("文件内容修改完成。。。。")
  64. elif os.path.isfile(self.path): # 判断是不是一个文件
  65. filename = os.path.basename(self.path)
  66. filename_li = filename.split('.')#分割,防止在修改文件名的时候把文件格式后缀一起修改了
  67. bool_change = False #判断文件名是否更改的标志
  68. for key in self.dict_replace.keys(): # 循环查看key
  69. if key in filename_li[0]: # 查看key是不是存在文件名的一部分
  70. filename_li[0] = filename_li[0].replace(key,self.dict_replace[key])
  71. bool_change = True #文件名被更改
  72. if bool_change == True: #判断文件名是否被修改
  73. filename = '.'.join(filename_li)
  74. print(filename,"正在修改文件名。。。")
  75. os.chdir(os.path.dirname(self.path)) #修改工作路径
  76. os.rename(os.path.basename(self.path),filename)#修改文件名
  77. self.path = os.path.abspath(filename)
  78. print(filename,"修改成功文件名成功。。。")
  79. for notreplace in self.tuple_notreplace: # 循环不能更改内容的元组
  80. if os.path.basename(self.path).endswith(notreplace): # 判断是不是不能更改类型的文件
  81. print("文件内容没有修改。。。。")
  82. break
  83. else:
  84. print("文件内容正在修改。。。。")
  85. code = chardet.detect(open(filePath,'rb').read())['encoding']
  86. with open(self.path,encoding=code) as f:
  87. file_str = f.read()
  88. for key in self.dict_replace.keys(): # 循环查看key
  89. if key in file_str: # 查看key是不是存在文件名的一部分
  90. file_str = file_str.replace(key,self.dict_replace[key])
  91. with open(self.path,'w',encoding=code) as f:
  92. f.write(file_str)
  93. print("文件内容修改完成。。。。")
  94. if __name__=="__main__":
  95. path = "D:\TestABCabc 1\wwwroot"
  96. dict_replace = {'a':"ZQQ",'c':'GG'} # 需要替换字符串的字典
  97. tuple_notreplace = ('.png','.pptx','.xlsx','.docx','jpg','psd','.eot','.ttf','.gif') #不替换内容的元组
  98. re = replace(path,dict_replace,tuple_notreplace)
  99. start = time.clock()
  100. print(start)
  101. re.replace()
  102. end = time.clock()
  103. print(end)
  104. print ("程序运行时间:",end-start)

四、总结

在写代码的时候现先考虑传入进来的是文件夹还是文件,之后在进行下一步的步骤,还要考虑代码的优化问题,我这里的代码明显优化不够,跑的太慢。在打开文件夹的时候需要以文本本身的编码方式打开,我们就需要提前获取到他的文本编码格式。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/81093
推荐阅读
相关标签
  

闽ICP备14008679号