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