如何從幾千個檔案中尋找出指定的內容
阿新 • • 發佈:2018-12-22
今天在處理資料時遇到這麼個問題,如何從幾千個txt檔案中找到我想要的內容呢?
這是我的實現思路。
- 讀取檔案
- 選中指定的內容段
- 在新路徑下儲存內容段並命名為之前的檔名
以下是用python實現的程式碼。有詳細註釋!
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import re regtxt = r'.+?\.txt' #掃描物件為txt檔案. regcontenthead = r'<!-- ========== METHOD SUMMARY =========== -->' #找出指定的開頭 regcontentend = r'</table>' #找到指定的結尾 class FileException(Exception): pass def getdirlist(filepath): """獲取目錄下所有的檔案.""" txtlist = [] #檔案集合. txtre = re.compile(regtxt) needfile = [] #存放結果. for parent, listdir, listfile in os.walk(filepath): for files in listfile: #獲取所有檔案. istxt = re.findall(txtre, files) filecontext = os.path.join(parent, files) #獲取非空的檔案. if istxt : txtlist.append(filecontext) #將所有的資料存放到needfile中. needfile.append(readfile(filecontext)) #print('needflie:', needfile) if needfile == []: raise FileException("no file can be find!") else: #print('needfile:',needfile) validatedata = getvalidata(needfile) #print ('validatedata', validatedata) print ('total file %s , validate file %s.' %(len(txtlist),len(validatedata))) def getvalidata(filelist=[]): """過濾集合中空的元素.""" valifile = [] for fp in filelist: if fp != None: valifile.append(fp) return valifile def readfile(filepath): """通過正則匹配文字中內容,並返回文字.""" flag = False contentrehead = re.compile(regcontenthead) #regcontenthead = r'<!-- ========== METHOD SUMMARY =========== -->' contentrend = re.compile(regcontentend) fp = open(filepath, 'r', encoding='UTF-8') str1 = "LCP_Read" str2 = "LCP_Write" Newfilepath = filepath.replace(str1, str2) #儲存到新的路徑 fpWrite = open(Newfilepath, "a+") lines = fp.readlines() #print('lines:', lines) flines = len(lines) #print('flines:', flines) #逐行匹配資料. for i in range(flines): iscontenthead = re.findall(contentrehead, lines[i]) j = i if iscontenthead: for j in range(flines): if j < i: continue else: iscontentend = re.findall(contentrend, lines[j]) fpWrite.write(lines[j]) #把指定的內容寫入檔案 if iscontentend: fp.close() fpWrite.close() #print('filepath', filepath) return filepath if __name__ == "__main__": getdirlist('C:\\Users\\Dandelion\\Desktop\\LCP_Read')