split.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import os
  2. import shutil
  3. from pathlib import Path
  4. def split_folder_files(folder_path, num_parts=8):
  5. """
  6. 将指定文件夹中的文件平均分成 num_parts 份,每份放入一个按序号命名的子文件夹中。
  7. :param folder_path: 要分割的文件夹路径(如 '20251023')
  8. :param num_parts: 分成几份,默认为8
  9. """
  10. folder = Path(folder_path)
  11. if not folder.exists():
  12. print(f"错误:文件夹 '{folder_path}' 不存在。")
  13. return
  14. if not folder.is_dir():
  15. print(f"错误:'{folder_path}' 不是一个文件夹。")
  16. return
  17. # 获取所有文件(排除子文件夹)
  18. files = [f for f in folder.iterdir() if f.is_file()]
  19. if len(files) == 0:
  20. print("警告:文件夹中没有文件可分割。")
  21. return
  22. # 打乱文件顺序以实现“随机”分布(可选)
  23. # 如果希望保持顺序,注释掉下一行
  24. # random.shuffle(files)
  25. # 计算每一份大致应有多少文件
  26. base_size = len(files) // num_parts
  27. remainder = len(files) % num_parts # 多余的前几份多分一个
  28. start_idx = 0
  29. for i in range(num_parts):
  30. # 前 remainder 份多放一个文件
  31. part_size = base_size + (1 if i < remainder else 0)
  32. end_idx = start_idx + part_size
  33. part_files = files[start_idx:end_idx]
  34. part_folder = folder / str(i + 1) # 子文件夹名为 '1', '2', ..., '8'
  35. try:
  36. part_folder.mkdir(exist_ok=True)
  37. print(f"已创建文件夹: {part_folder}")
  38. except Exception as e:
  39. print(f"无法创建文件夹 {part_folder}: {e}")
  40. continue
  41. # 复制文件到子文件夹
  42. for file_path in part_files:
  43. try:
  44. shutil.copy2(file_path, part_folder / file_path.name)
  45. except Exception as e:
  46. print(f"复制文件 {file_path.name} 时出错: {e}")
  47. print(f" → 放入 {len(part_files)} 个文件")
  48. start_idx = end_idx
  49. print(f"✅ 已完成:将 {len(files)} 个文件分成 {num_parts} 份,存放在 '{folder_path}' 内的子文件夹中。")
  50. # ================== 使用示例 ==================
  51. if __name__ == "__main__":
  52. target_folder = "20251023" # 主文件夹名
  53. parts = 8 # 可改为你需要的份数,如 5, 10 等
  54. split_folder_files(target_folder, num_parts=parts)