需要随机提取子文件夹

查看 32|回复 3
作者:kaijie117   
例如
母文件夹
    ---子文件夹1
    ---子文件夹2
    ---子文件夹3
    ---子文件夹4
    ---子文件夹5
......
    ---子文件夹1000
选择母文件夹路径
输入数字=数量
将对应数量的子文件夹和内部文件随机提取到另一个选择的目录

文件夹, 随机

Aircus   

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 = [os.path.join(src_dir, d) for d in os.listdir(src_dir) if os.path.isdir(os.path.join(src_dir, d))]
   
    # 随机选择指定数量的子文件夹
    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   

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


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

[Asm] 纯文本查看 复制代码@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运行。尽量别试极限值的情况
您需要登录后才可以回帖 登录 | 立即注册

返回顶部