应用场景:
系统不是自己开发的,而且不是自己熟悉的语言,本机也没有装相应的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')
桌面应用正在写~