使用python進行文字替換(包括替換檔名、資料夾名、文字名)
阿新 • • 發佈:2018-12-29
目錄
一、需求分析
總體概述:替換
- 檔名稱的替換
如果資料夾或文字檔案(各類字尾檔案)的名稱中存在某個字串,則將他替換為另外的字串。
- 檔案內容的替換
如果文字檔案(各類字尾檔案)的內容中存在某個字串,則將他替換為另外的字串。
二、細節要點
需要替換的是給定資料夾下面的所有檔案。
- 檔案是多層級的。(資料夾下面有資料夾有各類文字檔案,級數不確定,檔案個數有多有少,這裡我們就需要使用遞迴)
- 指定某一類或幾類的檔案不替換內容。(比如:指定以.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)
四、總結
在寫程式碼的時候現先考慮傳入進來的是資料夾還是檔案,之後在進行下一步的步驟,花妖考慮程式碼的優化問題,我這裡的程式碼明顯優化不夠,跑的太慢。在開啟資料夾的時候需要以文字本身的編碼方式開啟,我們就需要提前獲取到他的文字編碼格式。