1. 程式人生 > >使用python進行文字替換(包括替換檔名、資料夾名、文字名)

使用python進行文字替換(包括替換檔名、資料夾名、文字名)

目錄

一、需求分析

二、細節要點

三、程式碼

四、總結


一、需求分析

總體概述:替換

  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)

四、總結

在寫程式碼的時候現先考慮傳入進來的是資料夾還是檔案,之後在進行下一步的步驟,花妖考慮程式碼的優化問題,我這裡的程式碼明顯優化不夠,跑的太慢。在開啟資料夾的時候需要以文字本身的編碼方式開啟,我們就需要提前獲取到他的文字編碼格式。