如何在Python中使用os.walk获取特定文件或目录列表?
我想知道在使用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()