脚本抽取文件夹10%随机文件数量不符问题求助
问题根源:有放回抽样导致重复选中文件
嘿,这问题我太熟啦!你当前的代码用random.choice()循环抽样,这是有放回的随机选择——简单说就是同一个文件可能被选中好几次,但你只会复制它一次,最终实际复制的唯一文件数量自然会比int(len(files)*0.1)少,占比也就低于10%,而且每次重复的次数随机,所以每次结果数量都不一样。
看你给出的例子:29841个文件,预期要选2984个,但实际只复制了2852/2845个,差的那一百多个就是被重复选中的文件,因为已经复制过了,第二次选到就等于白选。
解决方案:用无放回抽样保证唯一选择
Python里专门有个函数解决这个问题:random.sample(),它会从列表里无放回地抽取指定数量的唯一元素,完美匹配你的需求。
修改后的代码如下:
import random import os import shutil # 假设你已经获取了files列表、subdir和output_folder路径 target_count = int(len(files) * 0.1) # 一次性选出target_count个不重复的文件 selected_files = random.sample(files, target_count) # 逐个复制选中的文件 for filename in selected_files: src = os.path.join(subdir, filename) dest = os.path.join(output_folder, filename) shutil.copy(src, dest)
额外优化:更精确的抽样比例(可选)
如果你的文件总数乘以0.1后有小数,int()会直接向下取整(比如1595*0.1=159.5,int后是159)。如果想要更接近严格的10%,可以用round()来四舍五入:
target_count = round(len(files) * 0.1)
这样1595个文件就会选160个,占比160/1595≈10.03%,更接近预期。
内容的提问来源于stack exchange,提问作者physlexic
相关产品推荐
相关产品推荐

