Разделение данных на тест и тренировку, включая - PullRequest
0 голосов
/ 27 июня 2018

Как разделить мою папку, содержащую несколько видеофайлов, на папки train и test, основываясь на переменных dataframe, которые сообщают мне, какое видео должно быть в папке train, а какое - в тестовой папке? (в Python 3.0). В котором несколько видео расположены в отдельных папках категории

Каждое видео можно найти, например, в следующих каталогах категорий:

C:\Users\Me\Videos\a
C:\Users\Me\Videos\b

Это означает, что для каждой категории мне нужны папки "train" и "test", например:

C:\Users\Me\Videos\a\train
C:\Users\Me\Videos\a\test

Хотя у меня есть (EDIT) CSV-файл, содержащий следующую информацию. Таким образом, я не хочу, чтобы мой поезд и разделение были случайными, но на основе двоичного кода в моем листе.

videoname |test|train|category|
-------------------------------
video1.mp4| 1  |0    |a       |
video2.mp4| 1  |0    |b       |
video3.mp4| 1  |0    |c       |
video4.mp4| 0  |1    |c       |

Может кто-нибудь указать мне, как я могу использовать этот файл для меня? Могу ли я как-то поместить файл в фрейм данных, который сообщает Python, куда перемещать файлы?

EDIT:

import os
import csv
from collections import defaultdict

videoroot = r'H:\Desktop'
transferrable_data = defaultdict(list)
with open(r'H:\Desktop\SVW.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        video_path_source = os.path.join(videoroot, row['Genre'], row['FileName'])
        if (row['Train 1?'] == 0):
            split_type = 'test'
        else:
            split_type = 'train'
        video_destination_path = os.path.join(videoroot, row['Genre'], split_type, row['FileName'])
        transferrable_data[video_path_source].append(video_destination_path)

1 Ответ

0 голосов
/ 27 июня 2018

Что ж, первое, что нужно сделать, это прочитать ваш Excel и построить отображение из исходного файла в папки назначения:

VIDEO_ROOT_FOLDER = 'C:\Users\Me\Videos'
transferrable_data = defaultdict(list)
for row in excel_iteratable:
    video_source_path = os.path.join(VIDEO_ROOT_FOLDER, row['category'], row['videoname'])
    if (row['test'] == 1):
        split_type = 'test'
    else:  # I suppose you can only dispatch to test or train in a row
        split_type = 'train'
    video_destination_path = os.path.join(VIDEO_ROOT_FOLDER, row['category'], split_type, row['videoname'])) 
    transferrable_data[video_path_source].append(video_destination_path)

, затем вы можете написать скрипт, в котором ваши файлы будут перемещены по правильным путям, используя один из двух следующих методов:

import os
os.rename("path/to/current/video", "path/to/destination/folder")

или если вам нужно скопировать (вы не хотите изменять папку с видео):

from shutil import copyfile
copyfile("path/to/current/video", "path/to/destination/folder")

Скажем, например, что ваше отображение:

transferrable_data = {'C:\Users\Me\Videos\a\video1.mp4' : ['C:\Users\Me\Videos\a\train\video1.mp4'], 'C:\Users\Me\Videos\a\video2.mp4': ['C:\Users\Me\Videos\b\test\video2.mp4', 'C:\Users\Me\Videos\c\test\video2.mp4']}

вы можете сделать что-то вроде:

from shutil import copyfile
transferrable_data = {'C:\Users\Me\Videos\a\video1.mp4' : ['C:\Users\Me\Videos\a\train\video1.mp4'], 'C:\Users\Me\Videos\a\video2.mp4': ['C:\Users\Me\Videos\b\test\video2.mp4', 'C:\Users\Me\Videos\c\test\video2.mp4']}
for src, destination_list in transferrable_data.items():
    for dest in destination_list:
        copyfile(src, dest)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...