需要一个批量复制的EXCEL或者程序

查看 7|回复 0
作者:l75401390   
我 需要一个工具,可以批量复制文件,我这边用了AI写了PY一段程序,但是这个程序只能复制到有盘符的位置,我需要复制到DBI链接的设备的文件夹里,所有目标位置没有路径,我在想是不是可以把这些文件复制到剪贴板里,然后我自己手动右键粘贴就可以了,我用AI一直生成想要的程序,所以在这里请教大家。
或者说能不能用EXCEL来处理,如果用EXCEL的话我需要这几个功能,自动生成指定文件夹的目录地址带链接,可以显示子文件夹和子文件的大小单位GB,然后我可以勾选这个子文件夹,可以多选,然后这些选择起来的子文件夹在另外一个单元格里可以显示总容量。这些勾选的内容可以一次性复制到我指定的文件夹,就是上面的DBI位置,但是实现起来好像有点问题,所以也可以生成一个TXT文件,将这些文件夹的浅醉0001,0002,0003,复制到TXT中,我再用下面的程序进行复制,也是一种办法,我感觉我说的有点复杂,现成excel文件有需要进行修改。。文件怎么上传、
import os
import shutil
import sys
import re
def matches_prefix(file_name, prefix):
    """
    检查文件名是否匹配给定的前缀
   
    Args:
        file_name: 文件名(不含路径)
        prefix: 要匹配的前缀
   
    Returns:
        bool: 如果匹配返回True,否则返回False
    """
    # 移除文件扩展名
    name_without_ext = os.path.splitext(file_name)[0]
   
    # 检查是否直接以前缀开头
    if name_without_ext.startswith(prefix):
        return True
   
    # 检查是否以数字形式匹配(例如输入"1"匹配"001"或"001_")
    if prefix.isdigit():
        # 提取文件名开头的数字部分(可能包含前导零和下划线)
        match = re.match(r'^(\d+)[_\s]*', name_without_ext)
        if match:
            file_prefix_num = match.group(1)
            # 比较数字值(忽略前导零)
            if int(file_prefix_num) == int(prefix):
                return True
   
    return False
def copy_files_by_prefix(source_dir, target_dir, prefixes, extensions=['.xci', '.xcz', '.nsp', '.nsz']):
    """
    复制指定前缀和扩展名的文件
   
    Args:
        source_dir: 源目录路径
        target_dir: 目标目录路径
        prefixes: 文件前缀列表,例如 ['0008', '1235']
        extensions: 文件扩展名列表
   
    Returns:
        int: 成功复制的文件数量
    """
    # 确保目标目录存在
    if not os.path.exists(target_dir):
        os.makedirs(target_dir)
   
    # 转换扩展名为小写以便比较
    extensions = [ext.lower() for ext in extensions]
   
    # 计数器
    total_copied = 0
   
    # 对每个前缀单独处理
    for prefix in prefixes:
        print(f"\n正在处理前缀: {prefix}")
        prefix_copied = 0
        found_files = []
        
        # 首先收集所有匹配的文件
        for root, dirs, files in os.walk(source_dir):
            for file in files:
                # 获取文件扩展名
                _, ext = os.path.splitext(file)
               
                # 检查文件扩展名是否符合要求
                if ext.lower() in extensions:
                    # 检查文件前缀是否符合要求
                    if matches_prefix(file, prefix):
                        found_files.append(os.path.join(root, file))
        
        print(f"找到 {len(found_files)} 个匹配文件")
        
        # 复制找到的文件
        for src_file in found_files:
            file_name = os.path.basename(src_file)
            
            # 构建目标文件路径(直接放在目标目录,不保留文件夹结构)
            dst_file = os.path.join(target_dir, file_name)
            
            # 处理目标文件重名情况
            counter = 1
            base_name, ext_name = os.path.splitext(file_name)
            while os.path.exists(dst_file):
                new_name = f"{base_name}_{counter}{ext_name}"
                dst_file = os.path.join(target_dir, new_name)
                counter += 1
            
            # 尝试复制文件,失败时允许重试
            success = False
            while not success:
                try:
                    shutil.copy2(src_file, dst_file)
                    print(f"已复制: {file_name} -> {os.path.basename(dst_file)}")
                    prefix_copied += 1
                    success = True
                except Exception as e:
                    print(f"复制失败: {file_name}, 错误: {e}")
                    retry = input("是否重试? (y/n): ").strip().lower()
                    if retry != 'y':
                        print(f"跳过文件: {file_name}")
                        break
        
        print(f"前缀 {prefix} 处理完成,复制了 {prefix_copied} 个文件")
        total_copied += prefix_copied
   
    return total_copied
def main():
    print("=== 文件复制工具 ===")
    print("支持的文件格式: .xci, .xcz, .nsp, .nsz")
    print("支持灵活前缀匹配,例如输入'1'可以匹配'001'或'001_'开头的文件")
    print("=" * 40)
   
    # 获取源目录
    while True:
        source_dir = input("请输入源目录路径: ").strip()
        if os.path.isdir(source_dir):
            break
        else:
            print(f"错误: 目录 '{source_dir}' 不存在! 请重新输入。")
   
    # 主循环
    while True:
        # 获取目标目录
        while True:
            target_dir = input("\n请输入目标目录路径: ").strip()
            if not target_dir:
                print("错误: 目标目录不能为空! 请重新输入。")
                continue
            
            # 如果目录不存在,尝试创建
            if not os.path.exists(target_dir):
                try:
                    os.makedirs(target_dir)
                    break
                except Exception as e:
                    print(f"创建目标目录失败: {e}")
                    continue
            else:
                break
        
        # 获取前缀列表
        while True:
            prefix_input = input("请输入文件前缀(多个前缀用逗号分隔,例如: 1,8,15): ").strip()
            if prefix_input:
                prefixes = [prefix.strip() for prefix in prefix_input.split(',')]
                break
            else:
                print("错误: 前缀不能为空! 请重新输入。")
        
        # 确认信息
        print("\n请确认以下信息:")
        print(f"源目录: {source_dir}")
        print(f"目标目录: {target_dir}")
        print(f"文件前缀: {', '.join(prefixes)}")
        confirm = input("\n是否开始复制? (y/n): ").strip().lower()
        
        if confirm != 'y':
            print("操作已取消。")
        else:
            # 执行复制
            print("\n开始复制文件...")
            total_copied = copy_files_by_prefix(source_dir, target_dir, prefixes)
            print(f"\n复制完成! 共复制了 {total_copied} 个文件。")
        
        # 询问是否继续
        continue_option = input("\n是否继续复制? (y-继续, n-退出, s-更改源目录): ").strip().lower()
        
        if continue_option == 'n':
            print("程序结束。")
            break
        elif continue_option == 's':
            # 更改源目录
            while True:
                new_source_dir = input("请输入新的源目录路径: ").strip()
                if os.path.isdir(new_source_dir):
                    source_dir = new_source_dir
                    break
                else:
                    print(f"错误: 目录 '{new_source_dir}' 不存在! 请重新输入。")
if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n程序被用户中断。")
    except Exception as e:
        print(f"程序发生错误: {e}")
    finally:
        if os.name == 'nt':  # Windows系统
            input("按回车键退出...")

前缀, 文件

您需要登录后才可以回帖 登录 | 立即注册

返回顶部