這幾天接手到了乙個很老很老的專案,php的,裡面的資料庫位址不是同一配置的。有很多子站點,每個字站點又有自己的配置檔案,這個時候,問題來了,要換資料庫位址了!!!
初聞這個問題,我整個人都是懵逼的,這不是搞我嘛?這麼多改起來得多麻煩?
但活兒還是得做啊,於是作為一名機智的大彩筆,我決定寫個python指令碼解決這個問題。
當然,這個問題可以被簡單理解為,給定路徑a,字串列表b,字串c,請將路徑a下的全部文字檔案(包括若干級子目錄下的文字檔案)中的字串列表b中的全部字串統一替換為字串c。
指令碼編寫如下:
# -*- coding: utf-8 -*-
# @file : replace_content.py
# @author: aaronjny
# @date : 2019/11/21
# @desc : 給定路徑a,字串列表b,字串c,請將路徑a下的全部文字檔案(包括若干級子目錄下的文字檔案)中的字串列表b中的全部字串統一替換為字串c。
import logging
import os
from pprint import pprint
import time
# 設定日誌輸出格式
logging.basicconfig(
format
='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
, level=logging.info)
# 需要進行替換的檔案的根路徑
root_path =
'/home/aaron/code/'
# 待替換的原始字串
origin_string_list =
['張三'
,'李四'
]# 用於替換的目標字串
target_string =
'王五'
# 需要替換的檔案的副檔名列表
filename_extensions =
['.php'
]# 檔案編碼型別
encode_type =
'utf-8'
check_results =
defcheck_filename_extension
(filename, extensions)
:"""
給定乙個檔名filename,判斷檔名是否以副檔名列表extensions中的任意乙個
args:
filename: 檔名
extensions: 副檔名列表
returns:
bool:給定檔案是否以副檔名列表中的乙個副檔名結尾
"""for extension in extensions:
if filename.endswith(extension)
:return
true
return
false
defcheck_content
(text, origin_strings)
:"""
檢查給定的文字text中,是否包含待替換字串列表origin_strings中的若干項
args:
text: 被檢查的文字
origin_strings: 待替換字串列表
returns:
list: 文字中包含的待替換字串列表
"""ret =
# 逐個查詢origin_string
for origin_string in origin_strings:
# 如果找到了,就加入到返回列表中
if origin_string in text:
return ret
defread_file
(path)
:"""
給定路徑path,讀取對應的文字檔案內容
args:
path: 檔案路徑
returns:
str: 檔案內容
"""with
open
(path,
'r', encoding=encode_type)
as f:
text = f.read(
)return text
defdfs_find
(path, origin_strings, filename_extensions)
:"""
遞迴查詢包含有origin_strings中的任意乙個字串的全部文字路徑
args:
path: 當前目錄路徑
origin_strings: 待替換的原始字串列表
filename_extensions: 副檔名列表,只對副檔名在列表中的檔案進行查詢
"""# 如果給定路徑不是目錄,就直接跳過
ifnot os.path.isdir(path)
:return
# 獲取路徑下的全部檔案和子目錄
for obj in os.listdir(path)
: abs_obj_path = os.path.abspath(os.path.join(path, obj)
)# 如果是目錄,就遞迴查詢
if os.path.isdir(abs_obj_path)
: dfs_find(abs_obj_path, origin_strings, filename_extensions)
# 是檔案,並且副檔名正確
elif check_filename_extension(abs_obj_path, filename_extensions)
:# 先讀取檔案
text = read_file(abs_obj_path)
# 然後判斷文字中是否包含指定字串
ret_strings = check_content(text, origin_strings)
if ret_strings:
logging.info(
'找到乙個需要進行替換的檔案 {},待替換詞為 {}'
.format
(abs_obj_path, ret_strings)
)(abs_obj_path, ret_strings)
)# 先查詢包含待替換字串的檔案路徑
logging.info(
'開始查詢需要替換的檔案...'
)dfs_find(root_path, origin_strings=origin_string_list,
filename_extensions=filename_extensions)
# 等待確認
logging.info(
'查詢完成,共有如下檔案需要進行替換,請確認!(10s後將自動開始執行)'
)time.sleep(1)
pprint(check_results)
time.sleep(10)
logging.info(
'開始替換...'
)# 開始替換
for path, origin_strings in check_results:
logging.info(
'正在替換 {}'
.format
(path)
)# 先讀取
text = read_file(path)
# 再替換
for origin_string in origin_strings:
text = text.replace(origin_string, target_string)
# 再寫入
with
open
(path,
'w', encoding=encode_type)
as f:
f.write(text)
logging.info(
'完畢!'
)
請注意,在執行指令碼前,請確認你清楚指令碼的執行結果,最好先對資料備份。請謹慎執行。 批量替換儲存過程內容指令碼sp SqlReplace
在資料庫開發過程中,如果某乙個表欄位名被重新命名。那麼在使用到該字段的儲存過程,對應的表欄位名也要修改。當存在多個儲存都有使用該表字段,需要逐個去修改替換,是一件比較繁瑣的事情,我們需要乙個能實現批量替換的方法。這裡我寫了乙個批量替換儲存過程內容的指令碼 use master goif object...
python 批量改名指令碼
第66屆艾美獎上,絕命毒師 一舉拿下了劇情類最佳劇集 最佳男主 最佳男女配角和最佳劇本5項重要大獎,成為艾美獎最大的贏家。這部歷時六年,共62集的劇集憑藉metacritic metacritic的評分是收錄各 的評分,並綜合得出的評分 99分 滿分100 的成績,成為寫入健力士世界紀錄大全的 世界...
python批量造數指令碼
coding utf8 from pymysql import connect,cursors from pymysql.err import operationalerror import sys,time class database 類名和模組名一致,robot匯入時不用寫類名 def ini...