如何获取目录中的文件,包括所有子目录

51 python

我正在尝试获取目录中所有日志文件(.log)的列表,包括所有子目录.

小智 85

import os
import os.path

for dirpath, dirnames, filenames in os.walk("."):
    for filename in [f for f in filenames if f.endswith(".log")]:
        print os.path.join(dirpath, filename)
Run Code Online (Sandbox Code Playgroud)

  • 如果你想排除某个目录,例如,`old_logs`,你可以简单地从 `dirnames` 中删除它,它不会被搜索:`if "old_logs" in dirnames: dirnames.remove("old_logs")` (3认同)
  • 如果您想在与“.”不同的目录中搜索。您可以将目录作为 sys.argv[1] 传递并调用 os.walk(sys.argv[1])。 (2认同)
  • 其他改进:使用生成器代替列表理解:for filename in(f for f ...) (2认同)

Sha*_*hin 13

您还可以将glob模块与os.walk一起使用.

import os
from glob import glob

files = []
start_dir = os.getcwd()
pattern   = "*.log"

for dir,_,_ in os.walk(start_dir):
    files.extend(glob(os.path.join(dir,pattern))) 
Run Code Online (Sandbox Code Playgroud)

  • @nueverest `os.walk` 在每次迭代时返回一个三元组 `(dirpath, dirnames, filenames)`,我们只对 `dirpath` 感兴趣(分配给上面的 `dir`);下划线仅用作我们不感兴趣的其他 2 个值的占位符(即`dirnames`,然后是`filenames`,被分配给变量`_`,我们永远不会使用它)。 (2认同)

ism*_*ail 7

Checkout Python递归目录沃克.简而言之,os.listdir()和os.walk()是你的朋友.


Fre*_*ens 5

仅使用(嵌套)列表理解的单行解决方案:

import os

path_list = [os.path.join(dirpath,filename) for dirpath, _, filenames in os.walk('.') for filename in filenames if filename.endswith('.log')]
Run Code Online (Sandbox Code Playgroud)