我的程序不相信文件夹是目录,假设它们是文件,并且因此,递归将文件夹打印为文件,然后由于没有等待遍历的文件夹,程序结束。
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 :(得分: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建议比自己构建它更简单。