如何在Python中查找目录及其子目录下的所有文件?

5 投票
3 回答
3672 浏览
提问于 2025-04-15 22:53

有没有什么内置的函数可以找到某个特定文件夹下的所有文件,包括子文件夹里的文件?我试过这个代码,但不太管用……可能是逻辑本身就有问题……

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 个回答

2

你需要使用os.walk()这个函数。

不过为了提高性能,可以试试一个叫做 scandir 的包。这个包在Python 3.5版本中也是标准库的一部分,详细信息可以在 PEP 471 找到。

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。另外,注意两个或多个path对象可以很容易地通过重载的/运算符连接在一起。

希望这对你有帮助!

14

没有现成的函数可以直接使用,不过通过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)

补充说明: os.walk这个函数可以递归地遍历文件夹里的所有内容;而recursive_file_gen这个函数是一个生成器(它使用yield关键字来逐个产生文件)。如果你想得到结果列表,可以这样做:

list(recursive_file_gen(mydir))

撰写回答