在您使用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
关于如何从大型目录结构中随机抽取大量文件的任何想法?
答案 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)