Хороший подход к выборке из списка каталогов неизвестного размера - использовать Выборка резервуара . При таком подходе вам не нужно запускать заранее и перечислять все файлы в каталоге. Прочитайте это один за другим и образец. Это работает даже тогда, когда вам нужно сэмплировать фиксированное количество файлов в нескольких каталогах.
Было бы хорошо использовать код сканирования каталогов на основе генератора, который выбирает один файл за раз, поэтому вы не используете gobs оперативной памяти для хранения всех имен файлов.
Вдоль строк (NB! нежелательный код!)
import numpy as np
import os
def ResSampleFiles(dirname, N):
"""pick N files from directory"""
sampled_files = list()
k = 0
for item in scandir(dirname):
if item.is_dir():
continue
full_path = os.path.join(dirname, item.name)
if k < N:
sampled_files.append(full_path)
else:
idx = np.random.randint(0, k+1)
if (idx < N):
sampled_files[idx] = full_path
k += 1
return sampled_files