在Python

时间:2017-12-04 06:01:11

标签: python

我想在Python中搜索一个文件,但是,我正在寻找文件的目录包含许多子目录和数十万甚至数百万个文件。到目前为止,我使用了以下代码,但速度非常慢。有没有更快的方法来查找文件?

for root, dirs, files in os.walk(search_dir):
    for name in files:
        if desired_filename==name:
            ...

1 个答案:

答案 0 :(得分:1)

如果@Shadow建议的glob("**/filename")方法效果不好,您可能需要为您使用的目录构建索引:

import pickle
from collections import defaultdict

# run this once
index = defaultdict(str)
for path_to_file, file_name in walk(search_dir):
    index[file_name] += '{};'.format(path_to_file)
pickle.dump(index, 'index.bin')

# load index
index = pickle.load('index.bin')

# run this to get semicolon-separated list of paths that end with the file
paths = index['my_file.txt']
for path in paths.split(';')[:-1]:
    # do stuff with the file

“数十万”的文件数量不是很大,并且在RAM中大约需要10-100 Mb,具体取决于路径长度。我正在使用defaultdict(str)来缩短和预测内存使用情况,但您也可以尝试defaultdict(list)defaultdict(tuple)

要了解此方法的执行速度,您可以尝试:

>>> d = {
    'file_{}.csv'.format(i): '/home/user/data/{};/home/user/backup;'.format(i) 
    for i in range(500000)
}
>>> d['file_4021.csv']
'/home/user/data/4021;/home/user/backup;'