標籤:grep 遞迴調用
不斷否定自己,但要堅持最初的意願。
小白已經實現了"將光碟片內容索引儲存為硬碟上的*.cdc文字檔",並獲得了命令列工具樣的程式,可以通過命令列調用python pycdc.pyw -e test.txt快速指定檔案名稱。
類似grep一樣,現在要實現搜尋的功能,開啟所有符合要求的檔案,讀取每一行,如果有指定關鍵詞在行內就列印輸出到螢幕……
結合已有的經驗,可以非常簡單地實現!
# -*- coding: utf-8 -*-import osdef cdcGrep(cdcpath, keyword): filelist = os.listdir(cdcpath) # 搜尋目錄中的檔案 for cdc in filelist: # 迴圈檔案清單 if ".cdc" in cdc: # 過濾器其他檔案,只關注.cdc print('找到目標檔案:{}'.format(cdc)) cdcfile = open(cdcpath + cdc) # 拼接檔案路徑,並開啟檔案 for line in cdcfile.readlines(): # 讀取檔案每一行,並迴圈 if keyword in line: # 判斷是否有關鍵詞在行中 print(line) cdcGrep('F:\\back\\', 'images')
以上代碼可以掃描出指定目錄"f:\back\"下的名稱中含有".cdc"中帶有關鍵詞的"images"行。
運行結果如下:
找到目標檔案:test1.cdc E:\iso\CentOS-6.8-x86_64-bin-DVD1\images;['pxeboot'];['efiboot.img', 'efidisk.img', 'install.img', 'TRANS.TBL'] E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot;[];['initrd.img', 'TRANS.TBL', 'vmlinuz'] 找到目標檔案:test2.cdc E:\iso\CentOS-6.8-x86_64-bin-DVD1;['EFI', 'images', 'isolinux', '[BOOT]'];['.discinfo', '.treeinfo', 'CentOS_BuildTag', 'EULA', 'GPL', 'RELEASE-NOTES-en-US.html', 'RPM-GPG-KEY-CentOS-6', 'RPM-GPG-KEY-CentOS-Debug-6', 'RPM-GPG-KEY-CentOS-Security-6', 'RPM-GPG-KEY-CentOS-Testing-6', 'TRANS.TBL'] E:\iso\CentOS-6.8-x86_64-bin-DVD1\images;['pxeboot'];['efiboot.img', 'efidisk.img', 'install.img', 'TRANS.TBL']
在上面的grep 實現例子中,沒有考慮子目錄的處理方式,因為如果直接open目錄進行讀操作,會出現錯誤。接下來將改進這段代碼,以便考慮到子目錄這種特殊情況。
# -*- coding: utf-8 -*-import osdef cdcGrep(cdcpath, keyword): expDict = {} filelist = os.listdir(cdcpath) # 搜尋目錄中的檔案 cdcpath = cdcpath + "\\" for cdc in filelist: # 迴圈檔案清單 if os.path.isdir(cdcpath+cdc): print(cdcpath+cdc) cdcGrep(cdcpath+cdc, keyword) # 若是子目錄,則遞迴調用完成尋找 else: if cdc.endswith('.cdc'): print(cdc) cdcfile = open(cdcpath + cdc) # 拼合檔案路徑,並開啟檔案 for line in cdcfile.readlines(): # 讀取檔案每一行,並循壞 if keyword in line: # 判斷是否有關鍵詞在行中 print(line) cdcGrep('F:\\back\\', 'images')
運行結果如下:
搜尋子目錄F:\back\\1找到目標檔案:test1.cdc E:\iso\CentOS-6.8-x86_64-bin-DVD1\images;['pxeboot'];['efiboot.img', 'efidisk.img', 'install.img', 'TRANS.TBL'] E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot;[];['initrd.img', 'TRANS.TBL', 'vmlinuz']搜尋子目錄F:\back\\2找到目標檔案:test2.cdc E:\iso\CentOS-6.8-x86_64-bin-DVD1;['EFI', 'images', 'isolinux', '[BOOT]'];['.discinfo', '.treeinfo', 'CentOS_BuildTag', 'EULA', 'GPL', 'RELEASE-NOTES-en-US.html', 'RPM-GPG-KEY-CentOS-6', 'RPM-GPG-KEY-CentOS-Debug-6', 'RPM-GPG-KEY-CentOS-Security-6', 'RPM-GPG-KEY-CentOS-Testing-6', 'TRANS.TBL'] E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot;[];['initrd.img', 'TRANS.TBL', 'vmlinuz']找到目標檔案:test3.cdc E:\iso\CentOS-6.8-x86_64-bin-DVD1;['EFI', 'images', 'isolinux', '[BOOT]'];['.discinfo', '.treeinfo', 'CentOS_BuildTag', 'EULA', 'GPL', 'RELEASE-NOTES-en-US.html', 'RPM-GPG-KEY-CentOS-6', 'RPM-GPG-KEY-CentOS-Debug-6', 'RPM-GPG-KEY-CentOS-Security-6', 'RPM-GPG-KEY-CentOS-Testing-6', 'TRANS.TBL'] E:\iso\CentOS-6.8-x86_64-bin-DVD1\images;['pxeboot'];['efiboot.img', 'efidisk.img', 'install.img', 'TRANS.TBL']
這邊對子目錄處理,使用了遞迴調用cdcGrep()來實現。
總結:本節實現了搜尋的功能,學習了函數的遞迴調用。
《可愛的Python》讀書筆記(四)