我正在使用os.walk()检查目录中的冗余文件并将其列出。伪代码看起来像这样:
def checkPath(path):
do the for dirname, dirnames, filenames in os.walk(path) thing here...
pathList = ["path1", "path2"]
for each in pathList:
checkPath(each)
所以这在第一次运行时效果很好,我按预期得到了所有内容,但是在第二条路径上的下一个os.walk上它只是直接跳过......在dirname,dirnames,filenames中没有任何内容。我做了一些打印语句来检查事情,它正在进入函数,但没有为os.walk()部分做任何事情。
在使os.walk()部分成为一个函数以查看它是否能解决问题之前,它是在与主体内联的for循环中。当我尝试(只是为了好玩)清理dirname,dirnames,deln的文件名变量,在第二个路径上进行清理时它说变量dirname不存在...
所以看起来,无论是否在函数内,os.walk()的连续迭代都不会填充......
想法?
谢谢!
添加一些工作代码作为示例,像这样。它正在做什么并不重要,只是试图让os.walk走多路径:
import os
def checkPath(path):
for dirname, dirnames, filenames in os.walk(path):
for filename in filenames:
print filename
pathList = ["c:\temp\folder1", "c:\temp\folder2"]
for path in pathList:
checkPath(path)
print "done"
可以这样做(试图看看是否以不同的方式调用os.walk,就像其他评论者建议的那样,可能有帮助),或者它可以内联完成,无论明显有效...... < / p>
再次感谢所有人,
答案 0 :(得分:6)
如果我在系统上使用引用非空目录的实际路径,那么您的代码适合我。
我怀疑你的线路可能有问题......
pathList = ["c:\temp\folder1", "c:\temp\folder2"]
...因为\t
和\f
都是有效的转义序列。
...试
pathList = ["c:\\temp\\folder1", "c:\\temp\\folder2"]
...如果这不是问题,那么引用您正在使用的实际代码会有所帮助。
答案 1 :(得分:3)
os.walk
会返回一个生成器:-) http://wiki.python.org/moin/Generators
有一些解决方法:
使用列表
ll = list(os.walk())
每次致电os.walk()
使用itertools.chain
你发布的代码不应该有这个问题(你每次都调用os.walk),但这让我真的想到了生成器耗尽。所以在编写代码时发布代码[0]
例如,[0],您的函数中是否有某种预定义参数?
答案 2 :(得分:1)
这是一个工作示例
import os
def checkPath(list_path):
for path in list_path:
for (path, dirs, files) in os.walk(path):
print len(files)
checkPath(["F:/","F:/"])
通过遍历树来生成目录树中的文件名 自上而下或自下而上。对于以树为根的树中的每个目录 目录顶部(包括顶部本身),它产生一个3元组(dirpath, dirnames,filenames)。
编辑:
如您的答案中所述,os.walk()
会返回一个生成器。生成器只能迭代一次。它不是存储值的结构,而是在调用时动态生成值。这就是你os.walk()
上第二次循环的原因,你没有更多的结果。您可以在每次需要时询问os.walk()
,或将os.walk()
存储到iterable中。