Python 1周内修改的文件名列表
我有一段脚本,它将创建一个文件列表来扫描关键字 问题是,日志文件的总容量约为11gb。当我在shell中使用Python 1周内修改的文件名列表,python,linux,logging,Python,Linux,Logging,我有一段脚本,它将创建一个文件列表来扫描关键字 问题是,日志文件的总容量约为11gb。当我在shell中使用grep搜索它们时,大约需要4到5分钟。当我使用python脚本执行此操作时,它只是将服务器挂起到需要重新启动的程度 它会导致整个服务器崩溃,这似乎不对,但实际上我不需要它滚动浏览所有文件,只需要浏览上周修改过的文件 到目前为止,我已经做到了: logs = [log for log in glob('/var/opt/cray/log/p0-current/*') if not os.
grep
搜索它们时,大约需要4到5分钟。当我使用python脚本执行此操作时,它只是将服务器挂起到需要重新启动的程度
它会导致整个服务器崩溃,这似乎不对,但实际上我不需要它滚动浏览所有文件,只需要浏览上周修改过的文件
到目前为止,我已经做到了:
logs = [log for log in glob('/var/opt/cray/log/p0-current/*') if not os.path.isdir(log)]
我想我需要在这之前添加一些东西,以便最初过滤出错误的文件
我一直在使用以下格式的os.path.getmtime
:
logs = [log for log in glob('/var/opt/cray/log/p0-current/*') if not os.path.isdir(log)]
for log in logs:
mtime = os.path.getmtime(log)
if mtime < "604800":
do-stuff (create a new list? Or update logs?)
logs=[log for log for log in glob('/var/opt/cray/log/p0 current/*'),如果不是os.path.isdir(log)]
对于登录日志:
mtime=os.path.getmtime(日志)
如果mtime<“604800”:
做一些事情(创建一个新的列表?或者更新日志?)
这就是我现在所处的位置,它不起作用,但我希望可以用内联列表做一些更优雅的事情?根据文件名的数量和内存的多少(512MB VPS?),您可能正在耗尽内存创建两个所有文件名的列表(一个来自环球,一个来自你的理解列表。)不一定是这样,但这就是我要说的 尝试切换到
iglob
(在引擎盖下使用os.scandir
,并返回迭代器)并使用生成器表达式,看看是否有帮助
另外,getmtime
获取时间,而不是从现在开始的间隔
import os
import glob
import time
week_ago = time.time() - 7 * 24 * 60 * 60
log_files = (
x for x in glob.iglob('/var/opt/cray/log/p0-current/*')
if not os.path.isdir(x)
and os.path.getmtime(x) > week_ago
)
for filename in log_files:
pass # do something
如果你想要优雅,请使用
man find
。否则,请尝试创建一个示例。这样我们可以更容易地帮助你。不确定你的意思,我不知道find()
是Python中的一件事。我正在学习。我认为我对我的需求的解释是最小的、完整的和可验证的。我希望对构建列表的条件进行进一步的修改。因此,当前列表日志
包含大量的文件名,但我想将其缩减到修改时间更短的文件超过604800秒(1周)我把它放在几秒钟内,因为当我使用os.path.getmtime(log)
然后打印结果时,我得到了一些巨大的数字。我查找了os.path.getmtime()
并发现结果在secs@StephenRauch-我可以使用类似于常规shell的东西吗?find/path/to/logs-type f-mtime-7
-这会更干净。在我学习Python的两周时间里……所有的事情似乎都比常规shell脚本冗长得多。我肯定这是我缺乏理解,但我很抱歉目前正在努力寻找Python优于Bash的优势。是的,man find
注释是对find手册页的参考。对于某些事情,命令行工具要优雅得多,因为它们是为这些事情设计的。但是……一旦您的需求变得更加多样化或更深入,Python就是一件非常好的事情知道。如果你想提高python的能力,我鼓励你继续这里介绍的项目。但是,如果你想从SO用户那里得到一些帮助,你应该创建一个MCVE。谢谢你的帮助,我将快速播放一下你的建议。另外,我检查了一下,它确实内存不足。这rks非常好!我在find/var/opt/cray/log/p0current-mtime-7-maxdepth 1
旁进行了测试,上面的响应是相同的列表,所以它工作得很好。我没有得到和os.path.getmtime(x)>一周前
在我的脑海中,这是说mtime大于一周?还是我遗漏了什么?mtime在这里是什么时候,而不是多久前,所以>是在之后