使用Python指令碼批量替換專案中的資料庫位址

2021-09-30 01:38:02 字數 4039 閱讀 2176

這幾天接手到了乙個很老很老的專案,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...