我正试图获取目录中所有日志文件(.log),包括所有子目录。
我正试图获取目录中所有日志文件(.log),包括所有子目录。
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)
old_logs
,您可以从 dirnames
中将其删除,这样它就不会被搜索到:if "old_logs" in dirnames: dirnames.remove("old_logs")
。 - CGFoXprint(os.path.join(dirpath, filename))
。 - volkit你也可以使用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)))
os.walk
在每次迭代时返回一个3元组 (dirpath, dirnames, filenames)
,我们只对 dirpath
感兴趣(在上面被赋值为 dir
);下划线仅用作其他两个我们不感兴趣的值的占位符(即将 dirnames
和 filenames
分别赋值给变量 _
,我们将永远不会使用它们)。 - tavnabdir
函数,请使用 for directory,_,_ ...
替代。 - Chris Collett一个仅使用列表推导式(嵌套)的单行解决方案:
import os
path_list = [os.path.join(dirpath,filename) for dirpath, _, filenames in os.walk('.') for filename in filenames if filename.endswith('.log')]
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 环境中)。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)
如果你想列出当前目录,可以使用类似以下的命令:
import os
for e in os.walk(os.getcwd()):
print e
只需要改变
os.getcwd()
到其他路径去获取结果。