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

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

111354 次浏览

检查 Python 递归目录获取器。简而言之 os.listdir ()和 os.walk ()是你的朋友。

如果你想在工作目录中列出,你可以使用这样的东西:

import os


for e in os.walk(os.getcwd()):
print e

改一下

os.getcwd()

另一条途径来达到目的。

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)

您还可以使用 globb 模块和 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)))

我有个办法:

import os
for logfile in os.popen('find . -type f -name *.log').read().split('\n')[0:-1]:
print logfile

或者

import subprocess
(out, err) = subprocess.Popen(["find", ".", "-type", "f", "-name", "*.log"], stdout=subprocess.PIPE).communicate()
for logfile in out.split('\n')[0:-1]:
print logfile

这两个利用了 find . -type f -name *.log的优势。

第一个比较简单,但不能保证 为空白时,添加 -name *.log, 但对于简单的 find ../testdata -type f工作良好 (在我的 OS X 环境中)。

第二种使用子进程的方法似乎更复杂,但这种方法是空白空间安全的(同样,在我的 OS X 环境中)。

灵感来自克里斯 · 邦奇, 在答案里 Https://stackoverflow.com/a/3503909/2834102

只使用(嵌套)列表内涵的单行解决方案:

import os


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

使用标准图书馆的 pathlib:

from pathlib import Path


working_dir = Path()
for path in working_dir.glob("**/*.log"):
print(path)
# OR if you need absolute paths
print(path.absolute())
# OR if you need only filenames without extension for further parsing
print(path.stem)