【问题标题】:Select files from specific directories从特定目录中选择文件
【发布时间】:2020-04-07 09:55:44
【问题描述】:

我正在尝试遍历子目录列表,并执行两个相关操作:

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

  • 读取该子目录中的文件

我已尝试调整 this question 中的答案,但无法仅打开某些子目录。我知道我可以递归地执行此操作,循环遍历每个文件,并使用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)

【问题讨论】:

    标签: python directory path glob


    【解决方案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() 之前。

    【讨论】:

    • 我喜欢这个,很优雅。不过倒数第二行必须是with open(os.path.join(root_dir, subdir, 'names.txt'), 'r') as f:
    • 另外,如何提取目录名称,例如“002normal”,假设上面还有其他目录?
    • 确实如此。我已经更新了加入subdirnames.txt 的答案(顺便说一下,不需要root_dir)。输出现在还包括通过调用 os.path.basename 提取子目录的基本名称。
    【解决方案2】:
    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())
    

    这就是你可以用你的文件结构做到这一点的方法。首先,您检查是否有任何子目录以“正常”结尾,如果是,您可以检查文件中的内容。您还必须构建文件的路径,以便您可以使用os.path.join 读取文件

    如果您有多个未知深度的子目录,您必须使用 while 做一些事情,但只要包含 names.txt 的目录以正常结尾,它就可以工作。

    【讨论】:

    • 谢谢。如何提取目录名称,例如“002normal”,假设上面还有其他目录?
    • 正如 blhsing 所说,您可以使用 os.path.basename(subdir)。但我也会添加它。
    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多