Как случайно выбрать файлы из файловой системы в Python - PullRequest
0 голосов
/ 11 декабря 2018

Есть ли эффективный способ выборки файлов из файловой системы, пока вы не достигнете целевого размера выборки в Python?

Например, допустим, у меня есть 10 миллионов файлов в произвольно вложенной структуре папок, и я хочуобразец из 20 000 файлов.

В настоящее время для плоских каталогов небольшого размера ~ 100k или около того я могу сделать что-то вроде этого:

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, и мне нужно будет отслеживать, какие файлы были включены всэмплировать, а затем продолжать цикл до тех пор, пока я не заполню корзину сэмплов.

import os
import random
sample_size = 20_000
count = 0
for direntry in os.scandir(path):
    if random.randint(0, 10) < 5:
        continue
    print(direntry.path)
    count += 1
    if count >= sample_size:
        print("reached sample_size")
        break

Есть идеи, как случайным образом сэмплировать большой выбор файлов из большой структуры каталогов?

1 Ответ

0 голосов
/ 12 декабря 2018

Используйте итераторы / генераторы, чтобы не хранить все файлы в памяти.И используйте Выборка из резервуара , чтобы выбрать выбранные образцы из основного потока имен файлов.

Код

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)
...