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

版权声明:如需转发,请留下我的博客链接 https://blog.csdn.net/qq_40705355/article/details/85337864

目录

一、需求分析

二、细节要点

三、代码

四、总结


一、需求分析

总体概述:替换

  1. 文件名称的替换

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

  1. 文件内容的替换

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


二、细节要点

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

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

 


三、代码

详细请看代码注释

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)

四、总结

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

猜你喜欢

转载自blog.csdn.net/qq_40705355/article/details/85337864