版权声明:如需转发,请留下我的博客链接 https://blog.csdn.net/qq_40705355/article/details/85337864
目录
一、需求分析
总体概述:替换
- 文件名称的替换
如果文件夹或文本文件(各类后缀文件)的名称中存在某个字符串,则将他替换为另外的字符串。
- 文件内容的替换
如果文本文件(各类后缀文件)的内容中存在某个字符串,则将他替换为另外的字符串。
二、细节要点
需要替换的是给定文件夹下面的所有文件。
- 文件是多层级的。(文件夹下面有文件夹有各类文本文件,级数不确定,文件个数有多有少,这里我们就需要使用递归)
- 指定某一类或几类的文件不替换内容。(比如:指定以.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)
四、总结
在写代码的时候现先考虑传入进来的是文件夹还是文件,之后在进行下一步的步骤,花妖考虑代码的优化问题,我这里的代码明显优化不够,跑的太慢。在打开文件夹的时候需要以文本本身的编码方式打开,我们就需要提前获取到他的文本编码格式。