为什么os.path.isdir() 在判断第二层文件夹的时候返回false?

代码如下,文件夹A包含文件夹B,B包含文件夹C,循环的时候isdir(B)返回的是True,再循环的时候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('.'))
阅读 5k
3 个回答

首先给楼上的回答点了个赞,回答得非常好。

这是我修改后的代码:

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 中运行结果是没有问题的!


另外,强烈建议使用内置函数进行目录遍历。

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

使用内置函数是最简便的方法。

if '.' in os.path.basename(x): 这句是为了判断是普通文件吗?万一文件名里面没有.怎么办呢?或者说文件夹里有.怎么办呢?这是题外话~
问题出在你这句上:search(os.listdir(os.path.join(os.getcwd(),x))),在第二重递归里os.listdir的参数是{basefolder}\b,其当然不是目录,而应该是{basefolder}\a\b,于是乎就退出了~
比如第一次for访问的是D:\a,第二次访问的是D:\b,当然不是目录了……

为啥要自己去造轮子……os库下面有个os.walk用这个不好吗?http://www.runoob.com/python/...

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题