如何在Python中遍历超过两个层级的子文件夹?
我想要遍历一个包含多个“层级”子文件夹的目录(如果我用错了术语请见谅),下面是一个例子:
$ 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
这样的参数(就像我在这里做的那样),因为它会返回三个元素。
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}')