我正在处理257个包含图像的文件夹。我想复制每个文件夹的80%图像,然后将它们复制到名为Training的新文件夹中。 257个文件夹中每个文件夹中剩余的20%图像将被复制到一个名为Test的新文件夹中。最后,我将有两个新文件夹“训练和测试”,其中“训练”包含我257个文件夹中每个图像的80%随机选择的图像,而“测试”则包含20%。
有没有可以实现此目的的Python函数?我做了一些研究,发现所有功能都已关闭,该功能将所有文件从源复制到目标文件夹。
谢谢
答案 0 :(得分:3)
以下是示例解决方案:
import random
import shutil
import os
folders = [...] # list of folders
# create the destination folders
os.mkdir("Training")
os.mkdir("Test")
for folder in folders:
contents = os.listdir(folder) # get contents of every folder
random.shuffle(contents) # shuffle the result
split_point = 4 * len(contents) // 5 # get ≈80% of the contents length (this is a splitting point)
for img in contents[:split_point]: # get ≈80% of the contents (first 80% images)
shutil.copy(os.path.join(folder, img), os.path.join("Training", img)) # and copy every file to the "Training" folder
for img in contents[split_point:]: # get ≈20% of the contents (last 20% images).
shutil.copy(os.path.join(folder, img), os.path.join("Test", img)) # and copy every file to the "Test" folder
注意1::假定所有文件夹都与此源位于同一文件夹中(或完整路径在folders
列表中指定)。
注意2::如果在不同的文件夹中有文件名相同的文件,并将它们复制到同一文件中,则先前复制的文件将被覆盖(没有任何警告)
注意3::该代码只能运行一次,并且在执行之前没有“ Training”或“ Test”文件夹。
注释4:可以手动和自动指定文件夹列表(例如os.listdir("path")
)
注释5::如果文件夹中80%(或20%)的文件不是整数,则将其四舍五入。
答案 1 :(得分:1)
这是我最终使用的代码(感谢Demian的输入):
#import libraries
import random
import shutil
import os
# Creating a Training and Testing folders
os.makedirs('Training')
os.makedirs('Testing')
basepath='C:\\aaa\\bbb\\257_ObjectCategories\\'
folders=os.listdir(basepath)
for folder in folders: # loop over the 257 folders
contents = os.listdir(os.path.join(basepath, folder))
random.shuffle(contents) # shuffle the result
split_point = round(0.8* len(contents))
for img in contents[:split_point]:
shutil.copy(os.path.join(os.path.join(basepath, folder), img), os.path.join("Training", img))
for img in contents[split_point:]:
shutil.copy(os.path.join(os.path.join(basepath, folder), img), os.path.join("Testing", img))