Python提高運維效率的腳本分享
哈嘍大家好我是咸魚,今天給大家分享一個能夠提升運維效率的 python 腳本
咸魚平常在工作當中通常會接觸到下面類似的場景:
- 容災切換的時候批量對機器上的配置文件內(nèi)容進行修改替換
- 對機器批量替換某個文件中的字段
對于 Linux 機器,咸魚可以寫個 shell 腳本或者直接批量使用 sed 命令就能很好的解決
但對于 Windows 機器,上面的方法就不管用了,我們就需要想其他的辦法
這里咸魚給大家分享一個由 python 編寫的腳本,這個腳本能夠去替換指定文本文件中的指定內(nèi)容,而且還能一次替換多個內(nèi)容
我們先看效果,目標文件:name.txt
1.修改一個內(nèi)容
python sed.py c:\name.txt Kanye Edison
2.修改多個內(nèi)容
python sed.py c:\name.txt Kanye,male Edison,female
源碼在文末哦
首先我們導入模塊
import sys import os import time from shutil import copy
然后我們來看一下腳本中的第一個函數(shù)——data_preprocess()
def data_preprocess(): file_name, old_str, new_str = sys.argv[1:4] #接收輸入的參數(shù):目標文件名,舊內(nèi)容、新內(nèi)容、字符編碼 try: # 傳入字符編碼參數(shù) encoding = sys.argv[4] except IndexError: # 沒有傳入字符編碼參數(shù)的話就默認使用 'utf-8' 字符編碼 encoding = 'utf-8' old_str_list = [i.encode(encoding) for i in old_str.split(',')] # 將舊內(nèi)容轉換成列表形式 new_str_list = [i.encode(encoding) for i in new_str.split(',')] # 將新內(nèi)容轉換成列表形式 assert len(old_str_list) == len(new_str_list) # 判斷用戶輸入的 old_str 和 new_str 是不是一一對應 trans_tabs = list(zip(old_str_list, new_str_list)) # 將要舊內(nèi)容列表(old_str_list)和新內(nèi)容列表( new_str_list)中的元素一一對應 return file_name, trans_tabs # 返回目標文件名,以及一個舊內(nèi)容元素和新內(nèi)容元素一一對應的列表
這個函數(shù)實現(xiàn)的功能是接收輸入的參數(shù)(目標文件名、要替換的內(nèi)容,替換的內(nèi)容、字符編碼格式),然后將要替換的內(nèi)容與替換的內(nèi)容分別轉換成列表形式
注意:替換多個內(nèi)容時在多個內(nèi)容之間用逗號隔開
例如我們敲如下命令替換一個內(nèi)容:
python sed.py c:\test.txt Edison Kanye
這個函數(shù)就會返回下面內(nèi)容(由于命令里沒有傳入字符編碼參數(shù),采取默認的 UTF-8)
file_name = c:\test.txt trans_tabs = [(Edsion, Kanye)]
如果我們需要替換多個內(nèi)容(例如將首字母改成大寫)
python sed.py c:\test.txt edsion,kanye,fish Edsion,Kanye,Fish utf-8
這個函數(shù)就會返回下面內(nèi)容(命令傳入了字符編碼參數(shù))
file_name = c:\test.txt trans_tabs = [(edsion, Edsion), (kanye,Kanye), (fish,Fish)]
接下來我們來看第二個函數(shù)——backup()
def backup(file_name): time_mark = time.strftime('%Y%m%d_%H%M%S') #時間戳 bak_dir = r'C:\Users\Administrator\Desktop' #備份路徑 basename = os.path.basename(file_name) os.makedirs(bak_dir) if not os.path.isdir(bak_dir) else True copy(file_name, os.path.join(bak_dir, basename + '_' + time_mark)) print("備份 %s 成功" %file_name)
這個函數(shù)的功能就是在修改文件之前先把文件備份,防止后期我們需要回滾復原
最后我們來看最后一個函數(shù)—— sed()
這個函數(shù)便是整個腳本的核心,它負責去執(zhí)行修改替換文件內(nèi)容的操作
def sed(file_name, trans_tabs): with open(file_name + '.swap', 'wb') as swap_fs, open(file_name, 'rb') as file_names: #打開一個臨時文件和目標文件 for line in file_names: # 逐行讀取 for tab in trans_tabs: line = line.replace(tab[0], tab[1]) if tab[0] in line else line # 修改替換操作 swap_fs.write(line) # 將修改后的內(nèi)容寫入到臨時文件當中 os.remove(file_name) # 刪除舊目標文件 os.rename(file_name + '.swap', file_name) # 將臨時文件重命名,就變成了新的目標文件
首先先打開一個臨時文件(file_name.swap)和目標文件(file_name)
然后對目標文件(file_name)進行逐行讀取到內(nèi)存上,再去對內(nèi)容進行修改,最后將修改后的內(nèi)容寫入到這個臨時文件(file_name.swap)中
修改完畢之后,把臨時文件重命名一下、把舊目標文件刪掉,這個臨時文件就變成了修改內(nèi)容后的目標文件了
import sys import os import time from shutil import copy def data_preprocess(): file_name, old_str, new_str = sys.argv[1:4] try: encoding = sys.argv[4] except IndexError: encoding = 'utf-8' old_str_list = [i.encode(encoding) for i in old_str.split(',')] new_str_list = [i.encode(encoding) for i in new_str.split(',')] assert len(old_str_list) == len(new_str_list) trans_tabs = list(zip(old_str_list, new_str_list)) return file_name, trans_tabs def backup(file_name): time_mark = time.strftime('%Y%m%d_%H%M%S') bak_dir = r'C:\Users\Administrator\Desktop' basename = os.path.basename(file_name) os.makedirs(bak_dir) if not os.path.isdir(bak_dir) else True copy(file_name, os.path.join(bak_dir, basename + '_' + time_mark)) print("備份 %s" %file_name) def sed(file_name, trans_tabs): with open(file_name + '.swap', 'wb') as swap_fs, open(file_name, 'rb') as file_names: for line in file_names: for tab in trans_tabs: line = line.replace(tab[0], tab[1]) if tab[0] in line else line swap_fs.write(line) os.remove(file_name) os.rename(file_name + '.swap', file_name) file_name, trans_tabs = data_preprocess() backup(file_name) sed(file_name, trans_tabs)
到此這篇關于Python提高運維效率的腳本分享的文章就介紹到這了,更多相關Python腳本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用tensorflow保存和恢復模型saver.restore
這篇文章主要介紹了使用tensorflow保存和恢復模型saver.restore方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02Python使用moviepy讀取字幕srt文件報錯的解決方法詳解
這篇文章主要為大家詳細介紹了Python使用moviepy讀取字幕srt文件報錯‘gbk‘?codec?can‘t?decode的兩種解決辦法,有需要的小伙伴可以跟隨小編一起學習一下2024-01-01PyTorch模型轉TensorRT是怎么實現(xiàn)的?
今天給大家?guī)淼氖顷P于Python的相關知識,文章圍繞著PyTorch模型轉TensorRT是怎么實現(xiàn)的展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06