如何在Python中遍历超过两个层级的子文件夹?

1 投票
2 回答
61 浏览
提问于 2025-04-14 18:28

我想要遍历一个包含多个“层级”子文件夹的目录(如果我用错了术语请见谅),下面是一个例子:

$ tree folder/
folder/
├── lever1_1
│   └── level2_1
│       └── level3_1
│           ├── file1.txt
│           └── file2.txt
└── lever1_2
    └── level2_1
        └── level3_1

6 directories, 2 files

我想检查这个目录里是否有.txt文件,如果有的话,我想修改它们所在的目录(比如在这个例子中是level3_1)。这意味着如果我这样做的话:

for dirs, files in os.walk("/home/user/folder"):
    for file in files:
        if file.endswith(".txt"):
            # do something to the directory they are in

会导致重复修改,因为level3_1里有好几个.txt文件,但我只想修改一次。

如果我使用 for dirs, files in os.walk("/home/user/folder"),我会遇到“值太多无法解包(预期2个)”的错误,我明白这个错误的意思,但我不能用固定的目录层级,因为在不同的情况下它们可能会变化。

有没有人知道怎么高效地做到这一点呢?

祝好

2 个回答

1

给定这个文件/目录结构:

$ tree folder/
folder/
├── lever1_1
│   └── level2_1
│       └── level3_1
│           ├── file1.txt
│           └── file2.txt
└── lever1_2
    └── level2_1
        └── level3_1

6 directories, 2 files

你需要的内容:

import os

if __name__ == '__main__':
    for root, dirs, files in os.walk("./folder"):
        for file in files:
            if file.endswith(".txt"):
                print(file)

要使用 os.walk 进行循环,你需要添加一个像 root 这样的参数(就像我在这里做的那样),因为它会返回三个元素。

详细信息请查看 https://docs.python.org/3/library/os.html

1

你需要调整一下你遍历结果的方式。因为 os.walk() 会为每个目录返回一个包含 (dirpath, dirnames, filenames) 的元组,所以你需要根据这个元组来正确地拆分它:

import os

root_folder = "./folder"

if __name__ == '__main__':
    for dirpath, dirnames, filenames in os.walk(root_folder):
        if any(file.endswith(".txt") for file in filenames):
            # Do something to the directory
            print(f'Found {filenames[0]} file in: {dirpath}')

撰写回答