``` import os import shutil from sklearn.model_selection import train_test_split import pandas as pd # 定义源目录路径 source_folder = 'C:/Users\Lenovo\Desktop\crcw不同端12k在0负载下\风扇端' subfolders = ["内圈故障", "球故障"] # 创建目标文件夹结构 target_folders = { 'train': '训练集', 'val': '验证集', 'test': '测试集' } os.makedirs('划分后的数据', exist_ok=True) for key, folder in target_folders.items(): for subfolder in subfolders: path = os.path.join('划分后的数据', folder, subfolder) os.makedirs(path, exist_ok=True) # 遍历每个子文件夹并读取CSV文件 all_data = [] for subfolder in subfolders: folder_path = os.path.join(source_folder, subfolder) files = [f for f in os.listdir(folder_path) if f.endswith('.csv')] # 将所有数据加载到列表中 for file in files: data = pd.read_csv(os.path.join(folder_path, file)) all_data.append((data, subfolder)) # 划分数据集 train_val, test = train_test_split(all_data, test_size=0.2, random_state=42) train, val = train_test_split(train_val, test_size=0.25, random_state=42) # 即最终比例为6:2:2 # 移动文件至对应的目标文件夹 def move_files(data_list, target_dir): for data, label in data_list: filename = f"{label}_{hash(str(data.iloc[0].values))}.csv" # 确保唯一性 save_path = os.path.join(target_folders[target_dir], label, filename) data.to_csv(save_path, index=False) move_files(train, 'train') move_files(val, 'val') move_files(test, 'test') print("数据集已成功划分为训练集、验证集和测试集!")```可以分析一下这段代码吗
时间: 2025-03-28 14:15:32 浏览: 50
当然可以!下面是对您提供的Python代码的功能及逻辑流程的详细解析:
---
### **代码功能概述**
该段代码的主要目的是对特定目录下的 CSV 文件进行分类处理,并将它们按一定比例划分为训练集、验证集和测试集,然后保存到新的文件夹结构中。
以下是代码的核心步骤分解及其作用说明:
---
### **1. 导入必要的库**
```python
import os
import shutil
from sklearn.model_selection import train_test_split
import pandas as pd
```
- `os` 和 `shutil`: 用于操作文件系统(例如创建文件夹或移动文件)。
- `pandas (pd)`: 提供了高效的数据处理能力,主要用于读取和存储 CSV 数据。
- `train_test_split`: 来自 Scikit-Learn 库,用于随机划分数据集为训练集、验证集和测试集。
---
### **2. 定义源目录和子文件夹名称**
```python
source_folder = 'C:/Users\Lenovo\Desktop\crcw不同端12k在0负载下\风扇端'
subfolders = ["内圈故障", "球故障"]
```
- 指定了原始数据所在的根目录 (`source_folder`) 和两个需要处理的子文件夹名:`"内圈故障"` 和 `"球故障"`。
---
### **3. 定义目标文件夹结构**
```python
target_folders = {
'train': '训练集',
'val': '验证集',
'test': '测试集'
}
os.makedirs('划分后的数据', exist_ok=True)
for key, folder in target_folders.items():
for subfolder in subfolders:
path = os.path.join('划分后的数据', folder, subfolder)
os.makedirs(path, exist_ok=True)
```
- 使用字典 `target_folders` 明确地指定了三个目标文件夹:“训练集”、“验证集”和“测试集”,并将这两个类别分别放置于对应的文件夹中。
- 调用了 `os.makedirs()` 函数递归地创建整个目标文件夹结构。
---
### **4. 加载所有 CSV 数据**
```python
all_data = []
for subfolder in subfolders:
folder_path = os.path.join(source_folder, subfolder)
files = [f for f in os.listdir(folder_path) if f.endswith('.csv')]
# 将所有数据加载到列表中
for file in files:
data = pd.read_csv(os.path.join(folder_path, file))
all_data.append((data, subfolder))
```
- 遍历指定的子文件夹(如:"内圈故障" 和 "球故障"),逐一查找其中的所有 `.csv` 文件。
- 对每个找到的 CSV 文件调用 `pd.read_csv()` 进行加载,并将其连同标签一起存放到名为 `all_data` 的列表中。每条记录的形式是 `(DataFrame, 标签)`。
---
### **5. 划分数据集**
```python
train_val, test = train_test_split(all_data, test_size=0.2, random_state=42)
train, val = train_test_split(train_val, test_size=0.25, random_state=42)
```
- 第一步:将全部数据按照 8:2 的比例拆分成 `train_val` 和 `test`。
- 第二步:再从 `train_val` 中抽取一部分作为验证集 `val`,最终使得三者比例为 **6:2:2**。
- 参数 `random_state=42` 确保每次运行结果一致(即固定随机种子)。
---
### **6. 移动并保存数据**
```python
def move_files(data_list, target_dir):
for data, label in data_list:
filename = f"{label}_{hash(str(data.iloc[0].values))}.csv"
save_path = os.path.join('划分后的数据', target_folders[target_dir], label, filename)
data.to_csv(save_path, index=False)
move_files(train, 'train')
move_files(val, 'val')
move_files(test, 'test')
```
- 自定义函数 `move_files()`: 接收两组参数——数据清单 (`data_list`) 及其所属集合类型(如 `'train'`, `'val'` 或 `'test'`)。它会生成唯一的文件名以避免覆盖冲突,并把每个 DataFrame 存储成一个新的 CSV 文件。
- 最终依次执行三次此过程,分别完成训练集、验证集和测试集的数据迁移工作。
---
### **7. 执行结束提示**
```python
print("数据集已成功划分为训练集、验证集和测试集!")
```
当上述所有任务都完成后,在控制台打印一条消息表明程序正常终止。
---
## 总结:
这段脚本实现了自动化批量处理带标签的 CSV 数据分割与组织的任务。通过引入 Python 常见工具链(Pandas + OS API + Sklearn),保证了灵活性和复用价值。
---
###
阅读全文
相关推荐







