|
发表于 2024-6-20 11:22:42
|
显示全部楼层
好的,看来需要对代码进行一些修正和增强。我们确保输出一些日志信息,以便调试。同时确保目标路径内文件夹的创建和文件移动逻辑正确。以下是改进后的代码:
- import os
- import shutil
- import random
- from collections import defaultdict
- def move_csv_files(source_dir, target_dir):
- # 获取所有csv文件的路径
- csv_files = []
- for root, dirs, files in os.walk(source_dir):
- for file in files:
- if file.endswith(".csv"):
- csv_files.append(os.path.join(root, file))
-
- # 确定测试集的大小,这里假设是20%
- num_test_files = max(2, int(0.2 * len(csv_files)))
-
- # 随机选择测试集文件
- test_files = random.sample(csv_files, num_test_files)
-
- # 按照源文件夹结构,将测试集文件移动到目标路径下的相应子文件夹
- for file in test_files:
- rel_path = os.path.relpath(file, source_dir)
- target_path = os.path.join(target_dir, rel_path)
- target_folder = os.path.dirname(target_path)
-
- # 确保目标文件夹存在,如果不存在则创建
- if not os.path.exists(target_folder):
- os.makedirs(target_folder)
- print(f"Created directory: {target_folder}")
-
- # 移动文件
- shutil.move(file, target_path)
- print(f"Moved file {file} to {target_path}")
-
- # 确保每个子文件夹至少有两个测试集文件
- test_files_dict = defaultdict(list)
- for file in test_files:
- rel_path = os.path.relpath(file, source_dir)
- folder = os.path.dirname(rel_path)
- test_files_dict[folder].append(file)
-
- for folder, files in test_files_dict.items():
- if len(files) < 2:
- print(f"Folder {folder} has less than 2 test files. Adding more files...")
- additional_files = [file for file in csv_files if os.path.dirname(os.path.relpath(file, source_dir)) == folder and file not in files]
- while len(files) < 2 and additional_files:
- additional_file = additional_files.pop(0)
- rel_path = os.path.relpath(additional_file, source_dir)
- target_path = os.path.join(target_dir, rel_path)
- shutil.move(additional_file, target_path)
- files.append(additional_file)
- print(f"Moved file {additional_file} to {target_path}")
- # 示例用法:
- source_directory = '/path/to/source_directory'
- target_directory = '/path/to/target_directory'
- move_csv_files(source_directory, target_directory)
复制代码
代码增强了以下几点:
1. 添加了日志输出,方便调试每一步操作。
2. 确保目标路径中每个子文件夹至少有两个测试集文件,如果不足则从其余的csv文件中选取适当数量的文件移动到相应子文件夹。
3. 使用`max(2, int(0.2 * len(csv_files)))`确保至少选择2个文件作为测试集,防止文件过少时无法满足每个子文件夹至少两个文件的要求。
请再次尝试运行这个代码,并确保源路径和目标路径的正确设置。如果还有问题,请告诉我!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|