《可愛的Python》讀書筆記(四)

來源:互聯網
上載者:User

標籤: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》讀書筆記(四)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.