2

我正在使用 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 循环中。当我尝试(只是为了好玩)用 del 清理目录名、目录名、文件名变量时,在第二条路径上清理时它说变量目录名不存在......

所以看起来,无论是否在函数内, 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,就像其他评论者所建议的那样,可能会有所帮助),或者它可以内联完成,任何明显有效的......

再次感谢大家,

4

3 回答 3

7

如果我在系统上使用引用非空目录的实际路径,您的代码对我有用。

我怀疑你的线路可能有问题......

pathList = ["c:\temp\folder1", "c:\temp\folder2"]

...因为\t\f都是有效的转义序列。

尝试...

pathList = ["c:\\temp\\folder1", "c:\\temp\\folder2"]

...如果这不是问题,那么引用您正在使用的实际代码会有所帮助。

于 2013-05-02T15:47:05.497 回答
4

os.walk返回一个生成器:-) http://wiki.python.org/moin/Generators

有一些解决方法:

使用列表

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

  2. os.walk()每次打电话

  3. 利用itertools.chain

您发布的代码应该没有这个问题(您每次都调用 os.walk),但这让我真正想到了生成器耗尽。因此,在您编写代码时发布您的代码 [0]

[0] 例如,您的函数中是否有某种预定义的参数?

于 2013-05-02T15:24:18.373 回答
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:/"])

见文档:

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

编辑:

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

于 2013-05-02T15:50:50.953 回答