或者说能不能用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("按回车键退出...")