Я ищу способ случайного выбора файла из дерева каталогов таким образом, чтобы любой отдельный файл имел точно такую же вероятность выбора, как и все другие файлы. Например, в следующем дереве файлов каждый файл должен иметь 25% вероятности выбора:
- / некоторые / родитель / реж /
- Foo.jpg
- sub_dir /
- bar.jpg
- Baz.jpg
- another_sub /
Мое временное решение, которое я использую, пока кодирую остальную часть приложения, должно иметь такую функцию:
def random_file(dir):
file = os.path.join(dir, random.choice(os.listdir(dir)));
if os.path.isdir(file):
return random_file(file)
else:
return file
Однако это, очевидно, смещает результаты в зависимости от того, где они находятся в дереве и сколько братьев и сестер находятся рядом с ними в их каталоге, поэтому они в конечном итоге имеют следующие вероятности выбора:
- / некоторые / родитель / реж /
- Foo.jpg - 50%
- sub_dir / (50%)
- Bar.jpg - 16,6%
- Baz.jpg - 16,6%
- another_sub / (16,6%)
Контекст для функции находится в приложении фоновой ротации, которое я пишу, поэтому возможность отфильтровывать нежелательные расширения файлов из результатов будет плюсом (хотя я мог бы просто принудительно сделать это, выбрав еще раз, если это не так тип файла, который я хочу ... который становится беспорядочным, если имеется множество файлов "неправильного" типа).