應用場景:
系統不是自己開發的,而且不是自己熟悉的語言,本機也沒有裝相應的IDE,常常需要在別人的代碼中找到特定的內容(如寫死的IP地址,這裏機關比較多,本來只該寫在配置文件中,但是由於開發人員水平有限或者遇到一些祖傳代碼,經常在很多地方寫死IP地址,導致遷移系統時經常出現無法正常使用的問題~~最近的系統遷移工作真的是要搞死人,哪兒哪兒都是寫死的)。
當然還包括一些日常維護工作中遇到的問題,由於本人不懂JAVA代碼,但是要幫助調試(一般是正式系統,問題還比較多),通過檢索關鍵詞找到對應SQL語句,分析SQL語句的邏輯問題。
思路:
1.使用PYTHON遍歷非二進制文件,逐行讀取文件,例如在一個JAVAweb項目中,讀取的文件包括.JAVA/.JSP/.JS/.XML等等;
2.在讀取的過程中直接跳過二進制文件,可以通過調試報錯信息來跳過,二進制文件編碼無法識別;
先用UTF-8編碼讀取,讀取失敗再用GBK嘗試,當然可以根據自己的需求設定編碼和追加編碼。
3.使用正則表達式對數據進行逐行匹配,並生成列表打印到控制檯;
話不多說,直接上代碼:
例子是搜索出現的10.10網段的IP地址,打印到result.txt文檔中。
#black_liu
#Date:2019/6/10
import os
import re
class search(object):
def __init__(self,text):
self.text=re.compile(text)
def write_txt(self,txt):
f=open(r'C:\Users\black\Desktop\result.txt','a')
f.write(txt)
def find(self,filepath):
sum=0
for x,y,z in os.walk(filepath):
for i in z:
filename=os.path.join(x,i)
try:
f=open(filename,'r',encoding='UTF-8').readlines()
except UnicodeDecodeError:
try:
f = open(filename, 'r', encoding='GBK').readlines()
except:
f=[]
for j in range(len(f)):
r=self.text.findall(f[j])
if len(r)>0:
row_num=j+1
sum=sum+1
t='filename is {0},row num is {1};\n\ttext_list:{2};\n\ttext:{3}'.format(filename,row_num,r,f[j])
print(t)
self.write_txt(t)
print('sum is {0}'.format(sum))
if __name__=='__main__':
search('10\.0\.\d{1,3}\.\d{1,3}').find(r'F:\cqgzf1')
桌面應用正在寫~