2010-05-19 78 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對象連接在一起。

希望這會有所幫助!

相關問題