Получение процента файлов в папке - PullRequest
0 голосов
/ 10 мая 2018

Я написал сценарий и назначил его часть, чтобы выбрать случайную выборку из 10% файлов в каталоге и скопировать их в новый каталог. Это мой метод ниже, но он дает менее 10% (~ 9,6%) каждый раз и никогда не дает одинаковое количество.

for x in range(int(len(files) *.1)):
    to_copy = choice(files)
    shutil.copy(os.path.join(subdir, to_copy), os.path.join(output_folder))

это дало

#files source       run 1        run 2
29841               2852         2845
1595                152          156
11324               1084         1082

1 Ответ

0 голосов
/ 10 мая 2018

Повторно вызывая random.choice(), вы фактически выбираете с заменой . Это означает, что вы можете выбирать один и тот же файл дважды, в отдельных обходах цикла.

Попробуйте random.sample() вместо:

for to_copy in random.sample(files, int(len(files)*.1)):
    shutil.copy(...)

Рассмотрим эту программу:

import random

seq = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

for _ in range(5):
    i = random.choice(seq)
    print(i, end=' ')
print()
for i in random.sample(seq, 5):
    print(i, end=' ')
print()

Вот два запуска программы:

$ python x.py 
g f e c b 
c j b a d 
$ python x.py 
c e a a e 
j f e a i 

Обратите внимание, что в первой строке второго прогона random.choice() случайно выбрал a дважды и e дважды. Если бы это были имена файлов, то было бы скопировано только 3 файла. Фактически выполняется пять копий, но избыточные копии не добавляют к количеству файлов. Конечно, количество повторяющихся идентичных выборов случайное, что приводит к противоречивому поведению, которое вы видите.

С другой стороны, вторая строка, полученная из random.sample(), никогда не будет иметь повторяющихся элементов, поскольку random.sample() выбирает без замены.

...