glob()函数如何排除子目录?

5

我正在编写一个脚本,将扫描一堆日志文件以查找字符串和服务器名称。

在我的测试中,我使用glob()创建了一个文件列表。

然而,为了改进我的测试,我从实际系统中复制了一个日志目录(11GB!)- 情况并不像之前那么顺利。看起来像是glob把子目录当作文件,因此readlines()很难读取它们。

我不关心子目录中的文件,我只想浏览本地目录中的文件。

我认为我可以使用os.walk()来实现这个目标,类似于:

logs = next(os.walk('var/opt/server/log/current'))[2]

与之相反:

logs = glob('/var/opt/server/log/current/*')

因为我正在学习Python,所以我想确保我以正确的方式学习东西...所以我上面说的是正确的吗?还是我应该稍微改变一下使用 glob() 的方式来实现这个目标?


我越玩越发现next()不是这里的正确工具,因为当它到达列表末尾时会引发StopIteration。我想我可以使用try:except:来处理StopIteration,但这似乎很混乱。我已经读到for*()将自动接受StopIteration,所以也许通过目录列表进行for循环会更好? - jonnybinthemix
2个回答

6

使用glob并过滤所有目录:

logs = [log for log in glob('/var/opt/server/log/current/*') if not os.path.isdir(log)]

太好了,谢谢。看起来运行得很好。尽管测试处理11GB的日志文件中的每一行是一个缓慢的过程!哈哈。- 我确定我完全理解log for log in。我知道for log in ....将为glob语句中的所有内容循环,但第一个log位是做什么的?它会将for log in glob()的每次迭代存储为log吗? - jonnybinthemix
@jonny 那个结构被称为列表推导式,或简称为列表推导。您可以在官方教程中阅读有关它的信息,并且主要文档中还有更多信息。 - PM 2Ring

0

使用递归参数来控制 glob 的深度。如果你设置 recursive=False,它将只匹配当前目录中的文件。

像这样:

logs = glob('/var/opt/server/log/current/*', recursive=False)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接