python查漏補缺之list列表的remove

來源:互聯網
上載者:User

標籤:python   os   path   工作   

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">        今天碰到一個坑,python的列表問題,錯誤往往出在你最熟悉的地方,特別是小地方,問題:我要列出目錄下所有的下一級檔案和子目錄(只包含下一級目錄而不包括目錄的目錄及檔案這種情況),然後只擷取當前子目錄。。問題描述很清楚,很輕易的就寫了個函數,不就是os.listdir(path)嘛,對就是這個,這個功能可以列出下一級的所有目錄和檔案,返回結果在一個列表中,那我們的主要工作的常規思路是不是就是把這個結果清單進行過濾?好,os也有相關的功能,os.path.isfile(filepath),就可以判斷檔案是不是一個檔案,是檔案,那就從列表刪除,處理完,就是我們要的最終結果清單了,是不是這樣呢?想法很完美,現實很殘酷,很意外,這個搞不定的。我們用代碼實驗:</span>

import osdef Count_SubDir(src):    listall = os.listdir(src)    for line in listall:        filepath = os.path.join(src,line)        if os.path.isfile(filepath):            listall.remove(line)    return listall    if __name__ == "__main__":    src = r'f:\src'    ret = Count_SubDir(src)    for line in ret:        print line
輸出結果:

>>> ================================ RESTART ================================>>> 1025102810291030103110321033103510361037103810401041104210431044104510461049105310552052207030763082GraphicsNDP40-KB2894842.mspSetup.exeSetupUi.dllSetupUtility.exesqmapi.dllUiInfo.xml>>> 
看結尾。。。還依然有檔案存在,我們對比下沒經過處理的原結果清單:

>>> ================================ RESTART ================================>>> 1025102810291030103110321033103510361037103810401041104210431044104510461049105310552052207030763082DHtmlHeader.htmlGraphicsheader.bmpNDP40-KB2894842.mspParameterInfo.xmlSetup.exeSetupEngine.dllSetupUi.dllSetupUi.xsdSetupUtility.exeSplashScreen.bmpsqmapi.dllStrings.xmlUiInfo.xmlwatermark.bmp>>> 
最後的檔案項目,可以對比下,是不是發現什麼規律了。。。隔一個漏掉一個。。。

那為什麼會出現這種情況呢?就是因為for迴圈和list.remove()方法的配合有問題,把流程自己走一遍,問題就暴露出來了

        我們走一遍:首先for迴圈,每次迴圈選中一個line,如果這個line是檔案,從list中刪除,然後第二次迴圈。。。。問題來了,是不是漏掉了什嗎?刪除之後,是不是還有什麼操作沒有代碼顯示?答案是有,

def Count_SubDir(src):    listdir = []    listall = os.listdir(src)    for line in listall:        filepath = os.path.join(src,line)        if os.path.isdir(filepath):            listdir.append(filepath)    return listdir
輸出結果為:

Type "copyright", "credits" or "license()" for more information.>>> ================================ RESTART ================================>>> f:\src\1025f:\src\1028f:\src\1029f:\src\1030f:\src\1031f:\src\1032f:\src\1033f:\src\1035f:\src\1036f:\src\1037f:\src\1038f:\src\1040f:\src\1041f:\src\1042f:\src\1043f:\src\1044f:\src\1045f:\src\1046f:\src\1049f:\src\1053f:\src\1055f:\src\2052f:\src\2070f:\src\3076f:\src\3082f:\src\Graphics>>> 

        好了,這次真的完整了,是真的目錄了。。。。不敢信,一開始沒找到問題的時候,總感覺沒問題。。。不分析結果還真把remove方法的末尾處理給漏掉了。。。我想不少人也只是知道remove的刪除這一步吧,沒有想到刪除之後的列表調整吧,哈哈!



python查漏補缺之list列表的remove

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.