Как рекурсивно копировать папки с одинаковыми именами в другую папку в Google Colab

#python #google-colaboratory #shutil #copytree

#python #google-colaboratory #shutil #copytree

Вопрос:

  • У меня есть 10 сгибов, по 2 папки в каждом сгибе face , и background я хочу скопировать разные сгибы внутри train, проверить папки, чтобы поезд или проверка были face background из разных сгибов.

  • Я попробовал следующий код, но поскольку Google Colab использует python 3.6.9, я не могу игнорировать ошибку folder exists (как в python 3.9), поэтому я получаю следующую ошибку:

Ошибка:

 try:
     mkdir(name, mode)
except OSError:
     # Cannot rely on checking for EEXIST, since the operating system

FileExistsError: [Errno 17] File exists: 'train/'
  

Мой код:

 #--------------
# Split Dataset
#==============
# we Already have the test set
# !mkdir train
# !mkdir valid
import os, shutil

fileList = os.listdir("NewDataset")
fileList.sort()
for i in [x for x in range(10) if ((x != 9) and (x != 1))]:
    # print(fileList[i])
    # Train
    if(i < 7):
        subPathList = glob.glob('NewDataset/' fileList[i] '/**/', recursive=False)
        for subPath in subPathList:
            shutil.copytree(subPath, 'train/')

    # Validate
    else:
        subPathList = glob.glob('NewDataset/' fileList[i] '/**/', recursive=False)
        for subPath in subPathList:
            shutil.copytree(subPath, 'valid/')
  

Ответ №1:

Решение состояло в том, чтобы копировать файлы один за другим рекурсивно:

 import os, shutil

for i in [x for x in range(10) if ((x != 9) and (x != 1))]:
    # print(fileList[i])
    # Train
    if(i > 2):
        subPathList = glob.glob('/content/NewDataset/' fileList[i] '/**/', recursive=False)
        for subPath in subPathList:
            for im in os.listdir(subPath):
                imFullPath = os.path.join(subPath, im)
                targetPath = os.path.join('/content/train',subPath.split('/')[-2]  '/')
                # print('Train: ', targetPath)
                shutil.copy(imFullPath, targetPath)
    # Validate
    else:
        subPathList = glob.glob('/content/NewDataset/' fileList[i] '/**/', recursive=False)
        for subPath in subPathList:
            for im in os.listdir(subPath):
                imFullPath = os.path.join(subPath, im)
                targetPath = os.path.join('/content/valid',subPath.split('/')[-2]   '/')
                # print('Validate: ', targetPath)
                shutil.copy(imFullPath, targetPath)