python目录递归遍历程序

时间:2013-02-07 23:11:25

标签: python recursion directory

我的程序不相信文件夹是目录,假设它们是文件,并且因此,递归将文件夹打印为文件,然后由于没有等待遍历的文件夹,程序结束。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

问题在于你没有检查正确的事情。 file只是文件名,而不是路径名。这就是为什么你需要os.path.join(dir, file),在下一行,对吧?所以你在isdir电话中也需要它。但你只是传递file

那么,而不是询问" .foo/bar/baz是一个目录?"你只是问{34}是baz一个目录?"正如您所期望的那样,它仅将baz解释为./baz。并且,因为那里(可能)没有" ./baz"你会得到假的。

所以,改变一下:

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建议比自己构建它更简单。