標籤: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