鍍金池/ 問答/Python  數(shù)據(jù)庫/ 為什么os.path.isdir() 在判斷第二層文件夾的時候返回false?

為什么os.path.isdir() 在判斷第二層文件夾的時候返回false?

代碼如下,文件夾A包含文件夾B,B包含文件夾C,循環(huán)的時候isdir(B)返回的是True,再循環(huán)的時候isdir(C)就返回False了,不對C下面的文件查找了。這是為什么?

import os

def search(directory):
    print(directory)
    for x in directory:
        if os.path.isdir(x):
            search(os.listdir(os.path.join(os.getcwd(),x)))
        if '.' in os.path.basename(x):
            print(os.path.basename(x))
        
search(os.listdir('.'))
回答
編輯回答
不討喜

if '.' in os.path.basename(x): 這句是為了判斷是普通文件嗎?萬一文件名里面沒有.怎么辦呢?或者說文件夾里有.怎么辦呢?這是題外話~
問題出在你這句上:search(os.listdir(os.path.join(os.getcwd(),x))),在第二重遞歸里os.listdir的參數(shù)是{basefolder}\b,其當(dāng)然不是目錄,而應(yīng)該是{basefolder}\a\b,于是乎就退出了~
比如第一次for訪問的是D:\a,第二次訪問的是D:\b,當(dāng)然不是目錄了……

為啥要自己去造輪子……os庫下面有個os.walk用這個不好嗎?http://www.runoob.com/python/...

2017年3月5日 19:02
編輯回答
傻丟丟

首先給樓上的回答點了個贊,回答得非常好。

這是我修改后的代碼:

import os

def search(directory):
    print(directory)    
    for x in directory:        
        if os.path.isdir(x):
            os.chdir(x) # 進入到新目錄
            search(os.listdir('.'))
            os.chdir(os.path.abspath('..')) # 退出到父目錄
        if '.' in os.path.basename(x):
            print(os.path.basename(x))
        
search(os.listdir('.'))

在 Python 3.6.3 中運行結(jié)果是沒有問題的!


另外,強烈建議使用內(nèi)置函數(shù)進行目錄遍歷。

for i in os.walk('.'):
    print(i)

使用內(nèi)置函數(shù)是最簡便的方法。

2017年6月30日 00:29
編輯回答
苦妄
import os
def list_file(path, result):
    if result is None:
        result = []
    file_list = os.listdir(path)
    for file_name in file_list:
        real_path = os.path.join(path, file_name)
        if os.path.isdir(real_path):
            list_file(real_path, result)
        else:
            result.append(real_path)
    return result

我這個遍歷可以返回值,你那個遍歷只能用print

2018年5月17日 17:43