Select 子目录中随机 x 个文件
Select randomly x files in subdirectories
我需要在一个数据集中随机取 10 个文件(图像),但是这个数据集是分层结构的。
所以我需要每个包含图像的子目录只随机保存其中的 10 个。有没有简单的方法可以做到这一点,还是我应该手动完成?
def getListOfFiles(dirName):
### create a list of file and sub directories
### names in the given directory
listOfFile = os.listdir(dirName)
allFiles = list()
### Iterate over all the entries
for entry in listOfFile:
### Create full path
fullPath = os.path.join(dirName, entry)
### If entry is a directory then get the list of files in this directory
if os.path.isdir(fullPath):
allFiles = allFiles + getListOfFiles(fullPath)
else:
allFiles.append(random.sample(fullPath, 10))
return allFiles
dirName = 'C:/Users/bla/bla'
### Get the list of all files in directory tree at given path
listOfFiles = getListOfFiles(dirName)
with open("elements.txt", mode='x') as f:
for elem in listOfFiles:
f.write(elem + '\n')
从未知大小的目录列表中抽样的好方法是使用 Reservoir Sampling。使用这种方法,您不必预先 运行 并列出目录中的所有文件。逐一阅读并举例。当您必须在多个目录中对固定数量的文件进行采样时,它甚至可以工作。
最好使用基于生成器的目录扫描代码,它一次选择一个文件,因此您不必预先使用大量内存来保存所有文件名。
沿线(注意!未删除的代码!)
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
我需要在一个数据集中随机取 10 个文件(图像),但是这个数据集是分层结构的。
所以我需要每个包含图像的子目录只随机保存其中的 10 个。有没有简单的方法可以做到这一点,还是我应该手动完成?
def getListOfFiles(dirName):
### create a list of file and sub directories
### names in the given directory
listOfFile = os.listdir(dirName)
allFiles = list()
### Iterate over all the entries
for entry in listOfFile:
### Create full path
fullPath = os.path.join(dirName, entry)
### If entry is a directory then get the list of files in this directory
if os.path.isdir(fullPath):
allFiles = allFiles + getListOfFiles(fullPath)
else:
allFiles.append(random.sample(fullPath, 10))
return allFiles
dirName = 'C:/Users/bla/bla'
### Get the list of all files in directory tree at given path
listOfFiles = getListOfFiles(dirName)
with open("elements.txt", mode='x') as f:
for elem in listOfFiles:
f.write(elem + '\n')
从未知大小的目录列表中抽样的好方法是使用 Reservoir Sampling。使用这种方法,您不必预先 运行 并列出目录中的所有文件。逐一阅读并举例。当您必须在多个目录中对固定数量的文件进行采样时,它甚至可以工作。
最好使用基于生成器的目录扫描代码,它一次选择一个文件,因此您不必预先使用大量内存来保存所有文件名。
沿线(注意!未删除的代码!)
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