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

0 投票
1 回答
1492 浏览
提问于 2025-04-17 15:49

我想知道在使用os.walk这个类的时候,能不能通过索引号来获取特定子文件夹里的某个文件。

我还想知道怎么只列出os.walk中某个特定层级的子文件夹,比如只列出根目录下的子文件夹。我可以列出所有的子文件夹,并且看到第一层的子文件夹是先分组在一起的,但我找不到不使用循环就能筛选出这些文件夹的方法...

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

使用type命令时,os.walk返回的元组显示为'list',而且在尝试使用索引号时出现了一些错误,这些错误和不当使用字典对象有关。我有点困惑。

谢谢!

1 个回答

1

你想做的事情不是特别清楚,不过我可以给你一个例子,我觉得这个例子能帮你理解怎么实现你想要的功能:打印出每个名为“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]))

你可以通过限制搜索的深度来提高效率,这样就不需要查看超过两层的文件夹了:

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()

或者,更高效一些,但稍微复杂一点,可以直接排除所有不叫“anyname”的深度为2的文件夹:

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()

撰写回答