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

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

代碼如下,文件夾A包含文件夾B,B包含文件夾C,循環(huán)的時(shí)候isdir(B)返回的是True,再循環(huán)的時(shí)候isdir(C)就返回False了,不對(duì)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): 這句是為了判斷是普通文件嗎?萬(wàn)一文件名里面沒(méi)有.怎么辦呢?或者說(shuō)文件夾里有.怎么辦呢?這是題外話(huà)~
問(wèn)題出在你這句上:search(os.listdir(os.path.join(os.getcwd(),x))),在第二重遞歸里os.listdir的參數(shù)是{basefolder}\b,其當(dāng)然不是目錄,而應(yīng)該是{basefolder}\a\b,于是乎就退出了~
比如第一次for訪問(wèn)的是D:\a,第二次訪問(wèn)的是D:\b,當(dāng)然不是目錄了……

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

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

首先給樓上的回答點(diǎn)了個(gè)贊,回答得非常好。

這是我修改后的代碼:

import os

def search(directory):
    print(directory)    
    for x in directory:        
        if os.path.isdir(x):
            os.chdir(x) # 進(jìn)入到新目錄
            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 中運(yùn)行結(jié)果是沒(méi)有問(wèn)題的!


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

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

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

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

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

2018年5月17日 17:43