如何在Python中使用os.walk获取特定文件或目录列表?

时间:2013-02-13 22:58:39

标签: python indexing tuples os.walk

我想知道是否可以通过索引号检索os.walk类中特定子文件夹中的特定文件。

我还想知道如何在os.walk中的特定级别列出子目录,例如只是根目录的子目录。我可以列出所有子目录,我可以看到第一级子目录的列表首先组合在一起,但我找不到一种方法来过滤那些不使用循环的那些......

这样的东西(从另一个问题改编而来)部分但我不知道如何从一个级别过滤文件夹:

dirs[:] = [d for d in dirs if re.match('anyname_\d{3}', d, flags=0)]

os.walk元组在使用type命令时显示为'list',而在尝试使用索引号时出现一些错误则指的是对字典对象的不当使用。我很困惑。

谢谢!

1 个答案:

答案 0 :(得分:1)

我不清楚你想做什么,但我可以提供一个例子(我认为)做了足够的事情,你可以弄清楚如何做你想要的:打印第3个文件的路径名在名为" anyname"的每个目录中;这正好位于顶部的两个级别:

for dirpath, dirnames, filenames in os.walk(top):
    depth = os.path.relpath(dirpath, top).count(os.pathsep)
    if depth == 2 and os.path.basename(dirpath) == "anyname":
        print(os.path.join(dirpath, filenames[2]))

通过修剪walk甚至不会查看超过2深的目录,您可以提高效率:

for dirpath, dirnames, filenames in os.walk(top):
    depth = os.path.relpath(dirpath, top).count(os.pathsep)
    if depth == 2:
        if os.path.basename(dirpath) == "anyname":
            print(os.path.join(dirpath, filenames[2]))
        dirnames.clear()

或者,更有效,但更复杂一点,修剪所有没有命名的深度2目录" anyname":

for dirpath, dirnames, filenames in os.walk(top):
    depth = os.path.relpath(dirpath, top).count(os.pathsep)
    if depth == 1:
        dirnames[:] = ["anyname"] if "anyname" in dirnames else []
    elif depth == 2:
        print(os.path.join(dirpath, filenames[2]))
        dirnames.clear()