2010-05-19 146 views
4

是否有内置的函数来查找特定目录下的所有文件,包括子目录下的文件? 我曾尝试这个代码,但没有工作...可能是本身就是错误的逻辑...在Python中,如何查找目录下的所有文件,包括子目录中的文件?

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 

回答

10

没有内置的功能,但用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)) 
+0

谢谢SilentGhost ... :) 请问您能解释一下代码吗... – pythBegin 2010-05-19 12:23:48

+0

@pythbegin:补充说明,请问是否有具体问题不明确。 – SilentGhost 2010-05-19 13:16:24

+0

好的...但我不明白产量的一部分... – pythBegin 2010-05-19 13:22:01

2

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

但为了提高性能,请尝试包装scandir。它还在Python 3.5的标准库的一部分,在PEP 471

2

我强烈推荐这个路径模块,由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对象连接在一起。

希望这会有所帮助!

相关问题