2

私のプログラムは、フォルダがファイルであると仮定して、フォルダがディレクトリであるとは信じていません。このため、再帰はフォルダをファイルとして出力し、通過するのを待っているフォルダがないため、プログラムは終了します。

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(".", "")
4

2 に答える 2

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
于 2013-02-07T23:15:49.763 に答える
2

問題は、あなたが正しいことをチェックしていないということです。fileパス名ではなく、単なるファイル名です。だからos.path.join(dir, file)、次の行に必要なのですよね?だからあなたもそれをisdir電話で必要とします。しかし、あなたはただ通過していますfile

.foo/bar/bazそれで、「ディレクトリですか?」と尋ねる代わりに。あなたはただ「bazディレクトリですか?」と尋ねているだけです。あなたが期待するように、それは同じbazように解釈します。./bazそして、(おそらく) " ./baz"がないので、Falseに戻ります。

したがって、これを変更します。

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

に:

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

そうは言ってもos.walk、sotapmeが提案するように使用することは、自分で作成するよりも簡単です。

于 2013-02-07T23:44:35.960 に答える