在Python中,如何查找目录下的所有文件,包括子目录中的文件?

时间:2010-05-19 12:08:53

标签: python list file

是否有内置函数可以查找特定目录下的所有文件,包括子目录下的文件? 我试过这段代码,但没有用......可能逻辑本身就错了......

def fun(mydir):
    lis=glob.glob(mydir)
    length=len(lis)
    l,i=0,0
    if len(lis):
        while(l+i<length):
            if os.path.isfile(lis[i]):
                final.append(lis[i])
                lis.pop(i)
                l=l+1
                i=i+1
            else:
                i=i+1
            print final
        fun(lis)
    else:
        print final

3 个答案:

答案 0 :(得分:12)

没有内置函数,但使用os.walk构建它是微不足道的:

import os
def recursive_file_gen(mydir):
    for root, dirs, files in os.walk(mydir):
        for file in files:
            yield os.path.join(root, file)

ETA os.walk函数递归遍历目录树; recursive_file_gen函数是一个生成器(使用yield关键字生成下一个文件)。要获得结果列表,请执行以下操作:

list(recursive_file_gen(mydir))

答案 1 :(得分:3)

我强烈推荐这个由Jason Orendorff编写的路径模块:

http://pypi.python.org/pypi/path.py/2.2

不幸的是,他的网站现在已关闭,但您仍然可以从上面的链接下载(或者通过easy_install,如果您愿意的话)。

使用此路径模块,您可以对路径执行各种操作,包括您请求的步行文件。这是一个例子:

from path import path

my_path = path('.')

for file in my_path.walkfiles():
    print file

for file in my_path.walkfiles('*.pdf'):
    print file

对于许多其他与路径有关的事项,也有便利功能:

In [1]: from path import path

In [2]: my_dir = path('my_dir')

In [3]: my_file = path('readme.txt')

In [5]: print my_dir / my_file
my_dir/readme.txt

In [6]: joined_path = my_dir / my_file

In [7]: print joined_path
my_dir/readme.txt

In [8]: print joined_path.parent
my_dir

In [9]: print joined_path.name
readme.txt

In [10]: print joined_path.namebase
readme

In [11]: print joined_path.ext
.txt

In [12]: joined_path.copy('some_output_path.txt')

In [13]: print path('some_output_path.txt').isfile()
True

In [14]: print path('some_output_path.txt').isdir()
False

还可以执行更多操作,但这些操作是我经常使用的一些操作。请注意,path类继承自string,因此可以在使用string的任何地方使用它。另请注意,可以使用重写的path运算符轻松地将两个或多个/对象连接在一起。

希望这有帮助!

答案 2 :(得分:2)

os.walk()就是你所需要的。

但是为了提高性能,请尝试使用scandir包。它也是Python 3.5中标准库的一部分,在PEP 471

中有描述