Python 从特定目录中选择文件

Python 从特定目录中选择文件,python,directory,path,glob,Python,Directory,Path,Glob,我试图循环遍历子目录列表,并执行两个相关操作: 仅选择与特定模式匹配的子目录,并保存该名称的一部分 读取该子目录中的文件 我曾尝试在中修改答案,但仅打开某些子目录时遇到问题。我知道我可以递归地这样做,循环遍历每个文件,并使用Path.parent提取其父目录,但这也会进入我不感兴趣的目录 我的文件结构如下所示: 002normal |- names.txt |- test.txt 002custom |- names.txt |- test.txt 我只希望目录以“正常”结尾。然后我将读取

我试图循环遍历子目录列表,并执行两个相关操作:

  • 仅选择与特定模式匹配的子目录,并保存该名称的一部分

  • 读取该子目录中的文件

我曾尝试在中修改答案,但仅打开某些子目录时遇到问题。我知道我可以递归地这样做,循环遍历每个文件,并使用
Path.parent
提取其父目录,但这也会进入我不感兴趣的目录

我的文件结构如下所示:

002normal
|- names.txt
|- test.txt
002custom
|- names.txt
|- test.txt
我只希望目录以“正常”结尾。然后我将读取该目录中名为“names.txt”的文件。我试过下面这种方法,但运气不好

import os
root_dir = "/Users/adamg/IM-logs"
for subdir, dirs, files in os.walk(root_dir):
    for f in files:
        print(subdir)

您可以就地修改
dirs
列表,以筛选出名称不以
'normal'
结尾的任何子目录,以便
os.walk
不会遍历到它们:

for subdir, dirs, files in os.walk(root_dir):
    dirs[:] = (name for name in dirs if name.endswith('normal'))
    if 'names.txt' in files:
        with open(os.path.join(subdir, 'names.txt')) as file:
            print(os.path.basename(subdir), file.read())
摘自
os.walk
的文档:

top-down
True
时,调用者可以就地修改
dirnames
列表 (可能使用
del
或slice赋值)和
walk()
只会重复出现 进入名称保留在
dirnames
中的子目录;这可能是 用于删减搜索,强制执行特定的访问顺序,甚至 通知调用方创建或重命名目录的
walk()
在它再次恢复之前,
walk()

这就是你可以用你的文件结构来做的。首先,检查是否有子目录以“normal”结尾,如果有,可以检查文件中的内容。此外,您还必须构建文件的路径,以便可以使用
os.path.join


如果您有多个深度未知的子目录,您必须在运行时处理,但只要包含names.txt的目录以正常方式结束,它就可以正常工作。

我喜欢这样,它非常优雅。第二行到最后一行需要是open(os.path.join(root_dir,subdir,'names.txt'),'r')作为f:though另外,假设上面有其他目录,如何提取目录名,例如“002normal”?啊,确实如此。我已经用
names.txt
更新了加入
subdir
的答案(顺便说一下,不需要
root\u dir
)。现在,输出还包括通过调用
os.path.basename
,提取子目录的基本名称。谢谢。假设上面还有其他目录,如何提取目录名,例如“002normal”?正如blhsing所说的,您可以使用os.path.basename(subdir)。但我还要补充一点。
import os
root_dir = "/Users/adamg/IM-logs"
for subdir, dirs, files in os.walk(root_dir):
    if str(subdir).endswith("normal"):
        for file in files:
            if str(file).startswith("names"):
                print(os.path.basename(subdir), file)
                f = open(os.path.join(root_dir,subdir,file), "r") 
                print(f.read())