从特定目录中选择文件

时间:2019-12-13 23:54:04

标签: python directory path glob

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

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

  • 读取该子目录中的文件

我尝试调整this question中的答案,但仅打开某些子目录有困难。我知道我可以递归执行此操作,在其中循环遍历每个文件,并使用Path.parent拉出其父目录,但这也将进入我不感兴趣的目录。

我的文件结构如下:

002normal
|- names.txt
|- test.txt
002custom
|- names.txt
|- test.txt

我只希望以“ normal”结尾的目录。然后,我将在该目录中读取名为“ 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)

2 个答案:

答案 0 :(得分:1)

您可以就地修改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的文档:

  

topdownTrue时,呼叫者可以就地修改dirnames列表   (也许使用del或切片分配),而walk()仅会递归   进入名称保留在dirnames中的子目录中;这可以是   用于修剪搜索,强加特定的访问顺序,甚至   通知walk()有关呼叫者创建或重命名的目录的信息   在再次恢复walk()之前。

答案 1 :(得分:1)

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

这就是使用文件结构进行操作的方式。首先,您检查子目录是否以“ normal”结尾,如果可以,则可以检查文件中的内容。另外,您还必须构建文件的路径,以便可以使用os.path.join

读取文件

如果您有多个深度不明的子目录,则必须使用while进行一些操作,但是只要包含names.txt的目录以正常结尾就可以使用。