赞
踩
目录
总体概述:替换
如果文件夹或文本文件(各类后缀文件)的名称中存在某个字符串,则将他替换为另外的字符串。
如果文本文件(各类后缀文件)的内容中存在某个字符串,则将他替换为另外的字符串。
需要替换的是给定文件夹下面的所有文件。
- 文件是多层级的。(文件夹下面有文件夹有各类文本文件,级数不确定,文件个数有多有少,这里我们就需要使用递归)
- 指定某一类或几类的文件不替换内容。(比如:指定以.png结尾的文件只改名称不该内容)
- 需要替换的字符串以字典的形式传入,键为:将要修改的字符串,值为:替换后的字符串。
- 不替换文本内容的文本类型以元组的形式传入。
- 自定义函数实现,传入三个参数,分别为文件路径、需要替换字符串的字典、那些文本类型不替换内容的元组。三
详细请看代码注释
- import os
- import chardet
- import time
-
- class replace:
- path = ""
- dict_repalce = {}
- tuple_notreplace = ()
-
- def __init__(self,p,d,t):
- self.path = p
- self.dict_replace = d
- self.tuple_notreplace = t
-
- def replace(self):
- if os.path.isdir(self.path): # 判断是否是一个文件夹
- li_os = os.listdir(self.path) # 返回一个文件节的列表
- for every_dir in li_os: # 循环判断每一个是否是文件夹
- filePath = os.path.join(self.path,every_dir)
- if os.path.isdir(filePath): # 如果是一个文件夹
- print(filePath,"这是一个文件夹")
- filename = os.path.basename(filePath)
- bool_change = False #判断文件名是否更改的标志
- for key in self.dict_replace.keys(): # 循环查看key
- if key in filename: # 查看key是不是存在文件名的一部分
- filename_new = filename.replace(key,self.dict_replace[key])
- bool_change = True #文件名被更改
- if bool_change == True: #判断文件名是否被修改
- print(filename,"正在修改文件夹名。。。")
- os.chdir(os.path.dirname(filePath)) #修改工作路径
- os.rename(os.path.basename(filePath),filename_new)#修改文件名
- filePath = os.path.abspath(filename_new)
- print(filename_new,"文件夹名修改成功。。。")
- replace(filePath,self.dict_replace,self.tuple_notreplace).replace()
-
- else:
- print(filePath,"这是一个文件")
- filename = os.path.basename(filePath)
- filename_li = filename.split('.')#分割,防止在修改文件名的时候把文件格式后缀一起修改了
- bool_change = False #判断文件名是否更改的标志
- for key in self.dict_replace.keys(): # 循环查看key
- if key in filename_li[0]: # 查看key是不是存在文件名的一部分
- filename_li[0] = filename_li[0].replace(key,self.dict_replace[key])
- bool_change = True #文件名被更改
- if bool_change == True: #判断文件名是否被修改
- filename_new = '.'.join(filename_li)#连接名称
- print(filename,"正在修改文件名。。。")
- os.chdir(os.path.dirname(filePath)) #修改工作路径
- os.rename(os.path.basename(filePath),filename_new)#修改文件名
- filePath = os.path.abspath(filename_new)
- print(filename_new,"文件名修改成功。。。")
-
-
- for notreplace in self.tuple_notreplace: # 循环不能更改内容的元组
- if os.path.basename(filePath).endswith(notreplace): # 判断是不是不能更改类型的文件
- print("文件内容没有修改。。。。")
- break
- else:
- print("文件内容正在修改。。。。")
- code = chardet.detect(open(filePath,'rb').read())['encoding']#获取文件编码
- print('编码格式',code)
- with open(filePath,errors='ignore',encoding=code) as f:#以自己的编码格式打开文件
- file_str = f.read()
- for key in self.dict_replace.keys(): # 循环查看key
- if key in file_str: # 查看key是不是存在文件名的一部分
- file_str = file_str.replace(key,self.dict_replace[key])
- with open(filePath,'w',encoding=code) as f:
- f.write(file_str)
- print("文件内容修改完成。。。。")
-
-
- elif os.path.isfile(self.path): # 判断是不是一个文件
- filename = os.path.basename(self.path)
- filename_li = filename.split('.')#分割,防止在修改文件名的时候把文件格式后缀一起修改了
- bool_change = False #判断文件名是否更改的标志
- for key in self.dict_replace.keys(): # 循环查看key
- if key in filename_li[0]: # 查看key是不是存在文件名的一部分
- filename_li[0] = filename_li[0].replace(key,self.dict_replace[key])
- bool_change = True #文件名被更改
- if bool_change == True: #判断文件名是否被修改
- filename = '.'.join(filename_li)
- print(filename,"正在修改文件名。。。")
- os.chdir(os.path.dirname(self.path)) #修改工作路径
- os.rename(os.path.basename(self.path),filename)#修改文件名
- self.path = os.path.abspath(filename)
- print(filename,"修改成功文件名成功。。。")
-
- for notreplace in self.tuple_notreplace: # 循环不能更改内容的元组
- if os.path.basename(self.path).endswith(notreplace): # 判断是不是不能更改类型的文件
- print("文件内容没有修改。。。。")
- break
- else:
- print("文件内容正在修改。。。。")
- code = chardet.detect(open(filePath,'rb').read())['encoding']
- with open(self.path,encoding=code) as f:
- file_str = f.read()
- for key in self.dict_replace.keys(): # 循环查看key
- if key in file_str: # 查看key是不是存在文件名的一部分
- file_str = file_str.replace(key,self.dict_replace[key])
- with open(self.path,'w',encoding=code) as f:
- f.write(file_str)
- print("文件内容修改完成。。。。")
-
-
- if __name__=="__main__":
- path = "D:\TestABCabc 1\wwwroot"
- dict_replace = {'a':"ZQQ",'c':'GG'} # 需要替换字符串的字典
- tuple_notreplace = ('.png','.pptx','.xlsx','.docx','jpg','psd','.eot','.ttf','.gif') #不替换内容的元组
- re = replace(path,dict_replace,tuple_notreplace)
- start = time.clock()
- print(start)
- re.replace()
- end = time.clock()
- print(end)
- print ("程序运行时间:",end-start)
在写代码的时候现先考虑传入进来的是文件夹还是文件,之后在进行下一步的步骤,还要考虑代码的优化问题,我这里的代码明显优化不够,跑的太慢。在打开文件夹的时候需要以文本本身的编码方式打开,我们就需要提前获取到他的文本编码格式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。