列表修改
我有我的剧本的部分,这将创建一个文件列表,通过扫描的关键词中..列表修改
的问题是,日志文件统称周围11GB。当我在shell中使用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?)
这就是那种我现在在哪里,它不工作,但我希望能有更多的东西优雅,我可以用做列表内联?
根据有多少文件名和多少内存(512MB VPS?),有可能你的内存不足,创建了所有文件名的两个列表(一个来自glob
,另一个来自你的列表理解)。案件,但这是我必须继续。
尝试切换到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
感谢您的帮助,我会尽快发挥您的建议。另外,我查了一下,它确实耗尽了内存。 – jonnybinthemix
这个效果非常好!我在'find/var/opt/cray/log/p0-current -mtime -7 -maxdepth 1'旁边进行了测试,并且上面的回应是相同的列表,所以它运行良好。我没有得到'和os.path.getmtime(x)> week_ago'在我的脑海里,这是说mtime大于1周?或者我错过了什么? – jonnybinthemix
这里是mtime,不是多久以前,所以>是 –
如果你想优雅的使用'男人find'。否则,请尝试创建[最小,完整和可验证](http://*.com/help/mcve)示例。这使我们更容易帮助你。 –
不确定你的意思,我不知道'find()'是Python中的一件事。我在学。我认为我对我的要求的解释是最小的,完整的和可验证的。希望添加进一步的修剪到建立我的列表的条件。所以目前'log'列表包含了大量的文件名,但是我想把它修改为修改时间少于604800秒(1周)的文件,我把它放在几秒钟内,因为当我使用' os.path.getmtime(log)'然后打印结果,我得到一些巨大的数字。我查找了'os.path.getmtime()',发现结果以秒为单位 – jonnybinthemix
@StephenRauch - 我可以使用类似于常规shell的东西吗? 'find/path/to/logs -type f -mtime -7' - 这会更干净。在2周内我一直在学习Python ..所有事情似乎都比普通的shell脚本长得多。我相信这是我的缺乏理解,但我现在努力寻找Python比Bash的好处。 – jonnybinthemix