有没有一种方法可以将随机文件从源复制到目标?

时间:2019-12-05 21:57:49

标签: python

我正在处理257个包含图像的文件夹。我想复制每个文件夹的80%图像,然后将它们复制到名为Training的新文件夹中。 257个文件夹中每个文件夹中剩余的20%图像将被复制到一个名为Test的新文件夹中。最后,我将有两个新文件夹“训练和测试”,其中“训练”包含我257个文件夹中每个图像的80%随机选择的图像,而“测试”则包含20%。

有没有可以实现此目的的Python函数?我做了一些研究,发现所有功能都已关闭,该功能将所有文件从源复制到目标文件夹。

谢谢

2 个答案:

答案 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))