kaijie117 发表于 2024-11-2 21:02

需要随机提取子文件夹

本帖最后由 kaijie117 于 2024-11-2 21:12 编辑

例如
母文件夹
    ---子文件夹1
    ---子文件夹2
    ---子文件夹3
    ---子文件夹4
    ---子文件夹5
......
    ---子文件夹1000

选择母文件夹路径
输入数字=数量
将对应数量的子文件夹和内部文件随机提取到另一个选择的目录内

Aircus 发表于 2024-11-2 21:02

import os
import shutil
import random

def select_folders(src_dir, num_folders, dest_dir):
    # 确保目标目录存在
    if not os.path.exists(dest_dir):
      os.makedirs(dest_dir)
   
    # 获取所有子文件夹
    folders =
   
    # 随机选择指定数量的子文件夹
    selected_folders = random.sample(folders, min(num_folders, len(folders)))
   
    # 复制选中的子文件夹到目标目录
    for folder in selected_folders:
      # 创建目标路径
      dest_path = os.path.join(dest_dir, os.path.basename(folder))
      # 复制文件夹及其内容
      shutil.copytree(folder, dest_path, dirs_exist_ok=True)
      print(f"Copied '{folder}' to '{dest_path}'")

def main():
    # 用户输入母文件夹路径
    src_dir = input("请输入母文件夹路径: ")
    # 用户输入需要提取的子文件夹数量
    num_folders = int(input("请输入需要提取的子文件夹数量: "))
    # 用户输入目标目录路径
    dest_dir = input("请输入目标目录路径: ")
   
    # 执行选择和复制操作
    select_folders(src_dir, num_folders, dest_dir)

if __name__ == "__main__":
    main()

xiaobaicai66 发表于 2024-11-2 23:45

我能写批处理,如果电脑没python环境的话更方便

xiaobaicai66 发表于 2024-11-2 23:52

xiaobaicai66 发表于 2024-11-2 23:45
我能写批处理,如果电脑没python环境的话更方便

@echo off
setlocal enabledelayedexpansion

REM 选择母文件夹路径
set "source_folder="
set /p "source_folder=请输入母文件夹路径: "
if not exist "!source_folder!" (
    echo 指定的路径不存在,请检查路径后重试。
    exit /b
)

REM 输入要提取的子文件夹数量
set "num_folders="
set /p "num_folders=请输入要提取的子文件夹数量: "
if !num_folders! lss 1 (
    echo 数量必须大于0,请重试。
    exit /b
)

REM 创建目标文件夹
set "target_folder="
set /p "target_folder=请输入目标文件夹路径: "
if not exist "!target_folder!" (
    mkdir "!target_folder!"
    echo 创建目标文件夹: "!target_folder!"
)

REM 创建临时文件
set "temp_file=temp_folders.txt"
> "!temp_file!" (
    REM 收集所有子文件夹并写入临时文件
    for /d %%D in ("%source_folder%\*") do (
      echo %%~nxD
    )
)

REM 计算子文件夹的数量
set "count=0"
for /F "usebackq delims=" %%F in ("!temp_file!") do (
    set /a count+=1
)

REM 检查是否有足够的子文件夹
if !count! lss !num_folders! (
    echo 可用的子文件夹数量不足,请减少数量。
    del "!temp_file!"
    exit /b
)

REM 随机选择子文件夹并移动
for /L %%i in (1,1,!num_folders!) do (
    set /a "rand=!random! %% count"

    REM 从临时文件中获取选中的文件夹
    set "selected_folder="
    for /F "usebackq delims=" %%F in ("!temp_file!") do (
      if !rand! equ 0 (
            set "selected_folder=%%F"
      )
      set /a rand-=1
    )

    REM 移动选中的文件夹
    if defined selected_folder (
      echo 正在移动文件夹: "!source_folder!\!selected_folder!" 到 "!target_folder!"
      move "!source_folder!\!selected_folder!" "!target_folder!\" >nul

      REM 从临时文件中移除选中的文件夹
      findstr /v /x "!selected_folder!" "!temp_file!" > temp2.txt
      move /y temp2.txt "!temp_file!" >nul
      set /a count-=1
    )
)

REM 删除临时文件
del "!temp_file!"

echo 所有操作完成!
pause

因为里面有中文,所以记事本写txt最后保存完直接修改bat后缀运行会乱码,所以保存的时候,另存为,保存类型不要选文本文档,要选下面的”所有文件(*.*)“;还有下面编码把UTF-8改成ANSI。再保存后修改后缀为bat运行。尽量别试极限值的情况
页: [1]
查看完整版本: 需要随机提取子文件夹