2013-02-07 137 views
1

我的程序並不認爲文件夾是目錄,假設它們是文件,並且因此,遞歸將文件夾打印爲文件,然後因爲沒有等待遍歷的文件夾,程序結束。python目錄遞歸遍歷程序

import os 
import sys 
class DRT: 
    def dirTrav(self, dir, buff): 
     newdir = [] 
     for file in os.listdir(dir): 
      print(file) 
      if(os.path.isdir(file)): 
       newdir.append(os.path.join(dir, file)) 
     for f in newdir: 
      print("dir: " + f) 
      self.dirTrav(f, "") 
dr = DRT() 
dr.dirTrav(".", "") 
+0

我剛剛在Ubuntu 12.04上用python 2.7測試過它,它工作。不知道爲什麼它不適合你。 – placeybordeaux

+0

@placeybordeaux im os os ...這可能是一個問題嗎? – kekkles4

+1

請注意:不要在Python中使用if語句和類似的括號,它震動並引起注意:「他在這裏做複雜的事,需要括號嗎?」而不是實際情況。 – abarnert

回答

1

問題是你沒有檢查正確的東西。 file只是文件名,而不是路徑名。這就是爲什麼你需要os.path.join(dir, file),在下一行,對嗎?所以你也需要撥打isdir。但你只是通過file

因此,而不是問「是.foo/bar/baz一個目錄?」你只是問「是baz一個目錄?」正如你所期望的那樣,它僅將baz解釋爲./baz。而且,因爲那裏(可能)不是「./baz」,你會回到False。所有這一切是說,用os.walk作爲sotapme建議是不是試圖建立它自己簡單

path = os.path.join(dir, file) 
if os.path.isdir(path): 
    newdir.append(path) 

因此,改變這種:

if(os.path.isdir(file)): 
    newdir.append(os.path.join(dir, file)) 

來。

7

從那裏參見os.walk

本示例顯示的開始目錄下在每個目錄中通過非目錄文件採取的字節數,不同之處在於它不根據任何CVS子目錄看:

import os 
from os.path import join, getsize 
for root, dirs, files in os.walk('python/Lib/email'): 
    print root, "consumes", 
    print sum(getsize(join(root, name)) for name in files), 
    print "bytes in", len(files), "non-directory files" 
    if 'CVS' in dirs: 
     dirs.remove('CVS') # don't visit CVS directories 
+0

謝謝你的回答,我沒有意識到os操作,但實現起來很簡單。 – kekkles4