我正在用Python为rawtherape编写一个插件。我需要从一个名为'关于ThisBuild.txt'可能存在于目录树中的任何位置。尽管rawtherape知道它安装在哪里,但这些数据被烘焙到二进制文件中。在
我的插件被设计为在没有任何命令行参数的情况下运行时收集基本系统数据,以便进行短路故障排除。通过获得版本号、修订号和变更集(也称为Mercurial),我可以找出脚本可能无法按预期工作的原因。好吧,这就是背景。在
我试过各种方法,有些建议在这个网站的其他地方。主要的一个是使用手术室步行匹配。在
问题是速度。搜索整个目录树就像看着油漆干了!在
为了减少负载,我试图预测可能的隐藏位置,并且只遍历这些位置。这是更快的,但有一个明显的缺点,即丢失一些文件。在
这就是我现在所拥有的。在Linux上测试过,但还没有在Windows上测试,因为我还在研究文件可能放在哪里。在
import fnmatch
import os
import sys
rootPath = ('/usr/share/doc/rawtherapee',
'~',
'/media/CoreData/opt/',
'/opt')
pattern = 'AboutThisBuild.txt'
# Return the first instance of RT found in the paths searched
for CheckPath in rootPath:
print("\n")
print(">>>>>>>>>>>>> " + CheckPath)
print("\n")
for root, dirs, files in os.walk(CheckPath, True, None, False):
for filename in fnmatch.filter(files, pattern):
print( os.path.join(root, filename))
break
通常是'关于ThisBuild.txt'存储在名为“rawtherape”的目录/子目录中,或在目录树中的某个位置具有字符串。我很天真,虽然我可以得到5000多个目录名,然后在这些目录中搜索“rawtherape”然后使用手术室步行为了遍历那些目录,除了所有的模块和函数之外,我还检查了目录中的所有文件。在
有没有人有一个更快的方法来搜索整个目录树,或者我被困在这个混合选项?在
搜索的关键在于你如何到达那里并不重要(例如作弊)。一旦有了结果,就可以相对快速地验证它是正确的。在
通过猜测,您可以相当有效地确定候选位置。例如,在Linux上,您可以首先尝试查找这些位置(显然不是所有的都是目录,但它不会对
os.path.isfile('/;l$/AboutThisBuild.txt')
造成任何损害)如果安装了它,可以尝试使用
locate
命令如果你还是找不到,那就继续使用蛮力法
下面是一个使用Python的
^{pr2}$strings
的粗略等价物听起来你需要一个纯python解决方案。如果没有,其他答案就足够了。在
在这种情况下,应该使用队列和线程遍历文件夹。虽然有些人可能会说线程永远不是解决方案,但是当您处于I/O绑定状态时,线程是一种很好的加速方式,在本例中就是这样。基本上,你会操作系统列表目录当前方向。如果里面有你的档案,就像1999年一样。如果没有,请将每个子文件夹添加到工作队列中。在
如果你很聪明,你可以使用depth firstvsbreadth first遍历来获得最好的结果。在
我在http://www.tutorialspoint.com/python/python_multithreading.htm工作中使用了一个非常成功的例子。请参阅标题为
Multithreaded Priority Queue
的部分。不过,这个示例可能会被更新以包含线程池,但这不是必需的。在相关问题 更多 >
编程相关推荐