os.walk迭代不是在Python中行走

时间:2013-05-02 15:15:20

标签: python

我正在使用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>

再次感谢所有人,

3 个答案:

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

有一些解决方法:

使用列表

  1. ll = list(os.walk())

  2. 每次致电os.walk()

  3. 使用itertools.chain

  4. 你发布的代码不应该有这个问题(你每次都调用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:/"])

See doc:

  

通过遍历树来生成目录树中的文件名   自上而下或自下而上。对于以树为根的树中的每个目录   目录顶部(包括顶部本身),它产生一个3元组(dirpath,   dirnames,filenames)。

编辑:

如您的答案中所述,os.walk()会返回一个生成器。生成器只能迭代一次。它不是存储值的结构,而是在调用时动态生成值。这就是你os.walk()上第二次循环的原因,你没有更多的结果。您可以在每次需要时询问os.walk(),或将os.walk()存储到iterable中。