1. 背景描述

最近在处理文件的时候,需要将文件根据TXT中的标签,进行分类整理至不同文件夹下。

具体情况是这样的。

首先在一个文件夹下,有这样一系列的mp3文件

├── music
       ├── test_00001.mp3
       ├── test_00002.mp3
       ├── test_00003.mp3
       ├── test_00004.mp3
       ├── ......
       ├── train_00001.mp3
       ├── train_00002.mp3
       ├── train_00003.mp3
       ├── train_00004.mp3
       ├── .......

然后,在一个TXT文件中,对每个mp3文件,都标注了文件类别

test_00001.mp3 1
test_00002.mp3 3
test_00003.mp3 2
test_00004.mp3 3
....
train_00001.mp3 2
train_00002.mp3 3
train_00003.mp3 4
train_00004.mp3 1

其中第一列就是对应文件的名字第二列就是该文件所属的类别

然后,还给出了不同类别对应的分类的具体名称

1: Classical
2: Rock 
3: Symphony
4: Country 

所以,主要目的就是实现将各个音乐文件,根据标签进行分类至不同文件夹。

同时,文件名带有test的文件,要放在test文件夹下的分类中,带有train的文件,要放在train文件夹下的分类中。

最终我们想实现的结果是这样的:

├── music_split
       ├── test
              ├── Classical
                     ├── test_00001.mp3
                     ├── ......
              ├── Rock
                     ├── test_00003.mp3
                     ├── ......
              ├── Symphony
                     ├── test_00002.mp3
                     ├── test_00004.mp3
                     ├── ......
              └── Country
                     ├── ......
       └── train
              ├── Classical
                     ├── train_00004.mp3
                     ├── ......
              ├── Rock
                     ├── train_00001.mp3
                     ├── ......
              ├── Symphony
                     ├── train_00002.mp3
                     ├── ......
              └── Country
                     ├── train_00003.mp3
                     ├── ......

接下来使用Python实现这个小小的功能。

2. 功能实现

详细源码如下:

import os
import shutil

# 读入分类的标签txt文件
label_file = open("E:\\【数据集】\\music\\list_label.txt", 'r')
# 原始文件的根目录
input_path = "E:\\【数据集】\\music\\music"
# 保存文件的根目录
output_path = "E:\\【数据集】\\music\\music_split"
# 标签数组
lables = ["Classical", "Rock", "Symphony", "Country"]

# 一行行读入标签文件
data = label_file.readlines()
# 计数用
i = 1
# 遍历数据
for line in data:
    # 通过空格拆分成数组
    str1 = line.split(" ")
    # 第一个是文件名
    file_name = str1[0]
    # 第二个是标签类别,并去除最后的换行字符
    file_label = str1[1].strip()
    # 原始文件的路径
    old_file_path = os.path.join(input_path, file_name)
    # 新文件路径
    new_file_path = ""

    # 如果文件名中有test字符,将其保存至test文件夹下的对应标签文件夹中
    if "test" in file_name:
        new_file_path = os.path.join(output_path, "test", lables[int(file_label) - 1])
    # 如果文件名中有 train 字符,将其保存至train文件夹下的对应标签文件夹中
    elif "train" in file_name:
        new_file_path = os.path.join(output_path, "train", lables[int(file_label) - 1])

    # 如果路径不存在,则创建
    if not os.path.exists(new_file_path):
        print("路径 " + new_file_path + " 不存在,正在创建......")
        os.makedirs(new_file_path)

    # 新文件位置
    new_file_path = os.path.join(new_file_path, file_name)
    print("" + str(i) + "\t正在将 " + old_file_path + " 复制到 " + new_file_path)
    # 复制文件
    shutil.copyfile(old_file_path, new_file_path)

    i = i + 1
# 完成提示
print("完成")

源码中已经给出了详细的注释。

如果有同样或者类似的需求,可以稍作修改后,直接使用此脚本。