python随机打乱文件夹内文件并按照3:1:1划分训练集、测试集、验证集分别存入三个文件夹,给出具体代码
时间: 2024-05-14 11:15:42 浏览: 113
以下是可以实现要求的 Python 代码:
```python
import os
import random
import shutil
# 设置随机种子
random.seed(42)
# 设置文件夹路径和所需比例
data_dir = '/path/to/folder'
train_ratio = 0.6 # 训练集占比
val_ratio = 0.2 # 验证集占比
# 获取文件名列表并打乱顺序
file_names = os.listdir(data_dir)
random.shuffle(file_names)
# 划分数据集并复制到对应的文件夹
num_train = int(len(file_names) * train_ratio)
num_val = int(len(file_names) * val_ratio)
train_file_names = file_names[:num_train]
val_file_names = file_names[num_train:num_train+num_val]
test_file_names = file_names[num_train+num_val:]
for file_list, folder_name in [(train_file_names, 'train'),
(val_file_names, 'val'),
(test_file_names, 'test')]:
folder_path = os.path.join(data_dir, folder_name)
os.makedirs(folder_path, exist_ok=True)
for file_name in file_list:
src_path = os.path.join(data_dir, file_name)
dst_path = os.path.join(folder_path, file_name)
shutil.copyfile(src_path, dst_path)
```
说明:
- 首先设置了随机种子,为了保证每次运行代码得到的数据集都是一样的。
- 然后设置了数据集路径和所需比例,这里按照 3:1:1 的比例进行划分。
- 通过 `os.listdir` 获取文件名列表,并使用 `random.shuffle` 打乱顺序。
- 接着计算训练集、验证集和测试集的文件数目,然后将文件名列表划分为三个列表。
- 最后循环遍历三个列表,将每个文件复制到相应的文件夹中。如果文件夹不存在则创建。使用 `shutil.copyfile` 进行复制,这里没有使用 `os.rename` 是因为在复制文件时会自动新建文件并将数据写入,而 `os.rename` 只是改变了文件名,需要保证目标文件夹已经存在。
阅读全文