如何在Python中从文件系统中随机采样文件

时间:2018-12-11 14:59:49

标签: python random filesystems

在您使用Python达到目标样本大小之前,是否有一种高效的方法可以从文件系统中采样文件?

例如,假设我在一个任意嵌套的文件夹结构中有1000万个文件,而我想要一个20,000个文件的样本。

目前,对于大约100k左右的小型平面目录,我可以执行以下操作:

ByCssSelector, using="input[type='submit']

但是,这不能很好地扩展。因此,我认为也许将随机检查放入循环中。这种工作方式有效,但是存在以下问题:如果目录中的文件数接近import os import random sample_size = 20_000 sample = random.sample(list(os.scandir(path)), sample_size) for direntry in sample: print(direntry.path) ,则可能无法获取完整目标sample_size,因此我需要跟踪哪些文件被包含在样本中,然后不断循环直到我填满样本桶。

sample_size

关于如何从大型目录结构中随机抽取大量文件的任何想法?

1 个答案:

答案 0 :(得分:1)

使用迭代器/生成器,这样就不会将所有文件都保留在内存中。并使用Reservoir sampling从基本上是文件名流中选择选定的样本。

代码

from pathlib import Path
import random

pathlist = Path("C:/Users/XXX/Documents").glob('**/*.py')
nof_samples = 10

rc = []
for k, path in enumerate(pathlist):
    if k < nof_samples:
        rc.append(str(path)) # because path is object not string
    else:
        i = random.randint(0, k)
        if i < nof_samples:
            rc[i] = str(path)

print(len(rc))
print(rc)