【发布时间】:2016-12-16 08:27:05
【问题描述】:
我将文件系统(仅文件名)存储/缓存在内存中,以便能够进行快速研究à la Everything。因此我不想使用操作系统的内置文件搜索 GUI。
我这样做:
import os
L = []
for root,dirs,files in os.walk(PATH):
L.append([root, files])
结果是这样的:
[['D:\\', ['a.jpg', 'b.jpg']],
...
['D:\\Temp12', ['test.txt', 'test2.txt']]]
问题在于,当L 包含数百万个元素时,进行研究会花费太多时间:
query = 'test2' #searching for filename containg this text
for dir in L:
for f in dir[1]:
if query in f:
print '%s found: %s' % (query, os.path.join(dir[0],f))
确实,这是一个非常幼稚的搜索,因为它需要浏览整个列表才能找到项目。
如何让查询更快?
也许列表似乎不是做全文研究的正确数据结构,有树状结构吗?
【问题讨论】:
-
在 Python 中,我认为
dictionary是您正在寻找的东西! -
@Acepcs:即使我使用 dict
{'D:\\': ['a.jpg', 'b.jpg'], ..., 'D:\\Temp12': ['test.txt', 'test2.txt']},我也必须遍历所有数以千计的键/值来进行搜索......你能准确地说出你的想法吗? -
我想到了一个完整的算法。当您浏览操作系统中的目录时,尝试制作一个文件名字典,每个键都是字母表中的一个字符,每个值都是以该字符开头的文件名列表,例如
{'a':['a3.jpg','ab.jpg'],'b':['banana.gif','bad.jpg']},所以你通过构建前缀键可以节省大量迭代时间。如果你的数据量真的很大,你可以构建嵌套前缀字典,就像用 Python 实现的树(在一定程度上) -
@Acepcs 好主意,它看起来像构建一个查找表/索引(就像在数据库中一样)。他们在 Python 或 Python 模块中的数据结构不是在内部执行此操作吗?
-
对不起,不知道Python中是否有高级数据结构的模块或开源包。但我知道人们在 Python 中使用
dictionary或list实现树结构是很常见的。
标签: python tree filesystems full-text-search binary-search-tree