【问题标题】:os.walk iteration not walking in Pythonos.walk 迭代不在 Python 中行走
【发布时间】:2013-05-02 15:15:20
【问题描述】:

我正在使用 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 上它只是直接跳过...目录名、目录名、文件名中没有任何内容。我做了一些打印语句来检查事情,它正在进入函数,但没有为 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,就像其他评论者所建议的那样,可能会有所帮助),或者可以内联完成,无论什么明显有效......

再次感谢大家,

【问题讨论】:

  • 它跳过的路径是什么?
  • 显示一些工作代码来证明你的问题...
  • 路径是简单的本地测试数据文件夹(电子表格、文档等)。路径列表 = ["c:\temp\folder1", "c:\temp\folder2"]。这些文件夹中的每一个都有子文件夹,其中包含一些文件。在这种情况下,它通过第一个文件夹进行处理,进入第二个文件夹,但 os.walk 似乎在 dirname、dirnames、filenames 变量中没有产生任何内容......
  • @user1229108 这是散文,不是代码
  • 如果提供给 os.walk 的路径不存在,则 for 循环将终止,而不会为变量分配任何内容或打印任何内容。如何在 for 循环上方添加打印语句以确保目录存在:print 'checking', path, os.path.isdir(path).

标签: python


【解决方案1】:

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

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

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

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

试试……

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

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

【讨论】:

  • 谢谢,但也试过了。它也不适用于原始字符串 r"c:\temp\folder1"
  • @user1229108 我唯一能想到的另一件事是第二个路径实际上并不包含任何文件。
  • 至于发布代码,这就是我正在使用的所有内容......说真的......只是这几行来测试走两个或更多目录,而在第一个之后我什么也没得到。
  • @Ant 我认为那是个玩笑 - 不要重新安装 python
【解决方案2】:

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

有一些解决方法:

使用列表

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

  2. 每次拨打os.walk()

  3. 使用itertools.chain

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

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

【讨论】:

    【解决方案3】:

    这是一个工作示例

    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:

    通过遍历树在目录树中生成文件名 自上而下或自下而上。对于根目录在树中的每个目录 目录顶部(包括顶部本身),它产生一个三元组(目录路径, 目录名,文件名)。

    编辑:

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

    【讨论】:

    • 以这种方式重新格式化并试运行。我在“for path in list_path:”之后添加了一条打印语句来打印路径的名称。对于第一个路径,它打印整数,指示每个文件夹和子文件夹中的文件数。这就是我所看到的。但是当它打印出它正在移动到下一条路径时,路径就会打印出来,然后脚本就结束了。甚至没有 0 通知它走了但没有返回......
    • 这也适用于我,在 2 个文件夹上进行了测试,在第一个 for 循环下方添加了“打印路径”以确保。
    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 2018-10-28
    • 2016-11-19
    • 2016-12-17
    • 1970-01-01
    • 2012-11-08
    • 2020-07-31
    • 2018-09-26
    相关资源
    最近更新 更多