import os import shutil from pathlib import Path import re def get_base_filename(filename): """获取文件名的基础部分(去除时间戳和序号后缀)""" # 匹配形如 _20250414094956928104_0.jpg 的后缀 pattern = r'(_\d+_\d+\.jpg)$' match = re.search(pattern, filename) if match: # 返回去除后缀的文件名 return filename[:-len(match.group(1))] return filename def compare_directories(dir1, dir2, output_dir): """比较两个目录中的文件并整理差异""" # 创建输出目录 os.makedirs(output_dir, exist_ok=True) # 获取两个目录中的所有文件 dir1_files = set(os.listdir(dir1)) dir2_files = set(os.listdir(dir2)) # 创建文件名映射 dir1_base_files = {get_base_filename(f): f for f in dir1_files} dir2_base_files = {get_base_filename(f): f for f in dir2_files} # 找出只在dir1中存在的文件 only_in_dir1 = set(dir1_base_files.keys()) - set(dir2_base_files.keys()) # 找出只在dir2中存在的文件 only_in_dir2 = set(dir2_base_files.keys()) - set(dir1_base_files.keys()) # 创建子目录 dir1_only_dir = os.path.join(output_dir, "only_in_dir1") dir2_only_dir = os.path.join(output_dir, "only_in_dir2") os.makedirs(dir1_only_dir, exist_ok=True) os.makedirs(dir2_only_dir, exist_ok=True) # 复制文件 for base_name in only_in_dir1: src_file = os.path.join(dir1, dir1_base_files[base_name]) dst_file = os.path.join(dir1_only_dir, dir1_base_files[base_name]) shutil.copy2(src_file, dst_file) print(f"复制 {src_file} 到 {dst_file}") for base_name in only_in_dir2: src_file = os.path.join(dir2, dir2_base_files[base_name]) dst_file = os.path.join(dir2_only_dir, dir2_base_files[base_name]) shutil.copy2(src_file, dst_file) print(f"复制 {src_file} 到 {dst_file}") # 打印统计信息 print(f"\n统计信息:") print(f"目录1中的文件总数: {len(dir1_files)}") print(f"目录2中的文件总数: {len(dir2_files)}") print(f"只在目录1中存在的文件数: {len(only_in_dir1)}") print(f"只在目录2中存在的文件数: {len(only_in_dir2)}") print(f"共同存在的文件数: {len(dir1_files) - len(only_in_dir1)}") if __name__ == "__main__": dir1 = r"D:\PythonProject\Model\output_20250329_140816_results" dir2 = r"D:\PythonProject\Model\Output\output_20250329_140816_results" output_dir = r"D:\PythonProject\Model\output_differences" compare_directories(dir1, dir2, output_dir)