#!/usr/bin/env python3 """ 处理所有订单班的图片整理 - 统一图片格式为jpg - 规范化命名 - 更新Markdown引用 """ import os import re import shutil from pathlib import Path from urllib.parse import unquote def process_all_orders(): """处理所有订单班""" base_path = Path("/Users/xiaoqi/Documents/Dev/Project/2025-09-08_n8nDEMO演示/data/订单班文档资料") # 订单班列表(排除已处理的文旅) order_classes = [ "财经商贸", "食品", "智能开发", "智能制造", "视觉设计", "交通物流", "土木", "大健康", "能源", "化工", "环保" ] print("=" * 60) print("开始处理其他订单班图片") print("=" * 60) for order_class in order_classes: order_dir = base_path / order_class if not order_dir.exists(): print(f"\n⚠ 跳过 {order_class}:目录不存在") continue notion_dir = order_dir / "notion文稿" if not notion_dir.exists(): print(f"\n⚠ 跳过 {order_class}:notion文稿目录不存在") continue print(f"\n处理 {order_class}...") process_single_order(order_class, notion_dir) print("\n" + "=" * 60) print("✅ 所有订单班处理完成!") def process_single_order(order_class: str, notion_dir: Path): """处理单个订单班""" image_dir = notion_dir / "image" image_dir.mkdir(exist_ok=True) # 收集所有图片 all_images = [] for ext in ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']: all_images.extend(notion_dir.glob(f"*.{ext}")) all_images.extend(notion_dir.glob(f"*.{ext.upper()}")) all_images.extend(image_dir.glob(f"*.{ext}")) all_images.extend(image_dir.glob(f"*.{ext.upper()}")) # 去重 all_images = list(set(all_images)) if not all_images: print(f" 没有找到图片") return print(f" 找到 {len(all_images)} 张图片") # 分类计数器 counters = { "设计图": 0, "展示图": 0, "效果图": 0, "流程图": 0, "场景图": 0, "图片": 0 } # 映射关系 image_mapping = {} # 处理每张图片 for img_path in sorted(all_images): old_name = img_path.name new_name = generate_new_name(old_name, counters) new_path = image_dir / new_name # 移动或重命名 if img_path != new_path: try: if img_path.parent != image_dir: # 需要移动到image目录 shutil.move(str(img_path), str(new_path)) else: # 只需重命名 img_path.rename(new_path) image_mapping[old_name] = new_name print(f" ✓ {old_name} → {new_name}") except Exception as e: print(f" ✗ 失败 {old_name}: {e}") # 更新Markdown文件 if image_mapping: update_markdown_files(notion_dir, image_mapping) create_index(order_class, image_dir, len(all_images)) def generate_new_name(filename: str, counters: dict) -> str: """生成新的规范化文件名""" name = Path(filename).stem.lower() # 根据关键词分类 if any(kw in name for kw in ['设计', 'design', 'whisk', 'cad', '3d', '三维', '渲染', '效果图', 'render']): counters["设计图"] += 1 return f"设计图_{counters['设计图']:02d}.jpg" elif any(kw in name for kw in ['展示', 'display', 'show', '展台', '展位', '展览']): counters["展示图"] += 1 return f"展示图_{counters['展示图']:02d}.jpg" elif any(kw in name for kw in ['效果', 'effect', '成品', '最终']): counters["效果图"] += 1 return f"效果图_{counters['效果图']:02d}.jpg" elif any(kw in name for kw in ['流程', 'flow', 'process', '步骤', '架构', 'diagram']): counters["流程图"] += 1 return f"流程图_{counters['流程图']:02d}.jpg" elif any(kw in name for kw in ['场景', 'scene', '展会', '博览', '会场', '现场', '签到', '试驾', '实景', '照片']): counters["场景图"] += 1 return f"场景图_{counters['场景图']:02d}.jpg" elif name[0:1].isdigit(): # 数字开头的文件 counters["展示图"] += 1 return f"展示图_{counters['展示图']:02d}.jpg" else: # 其他图片 counters["图片"] += 1 return f"图片_{counters['图片']:02d}.jpg" def update_markdown_files(notion_dir: Path, image_mapping: dict): """更新Markdown文件中的图片引用""" md_files = list(notion_dir.glob("*.md")) for md_file in md_files: try: content = md_file.read_text(encoding='utf-8') original_content = content # 更新每个图片引用 for old_name, new_name in image_mapping.items(): # 处理各种可能的引用格式 # 1. 普通引用 content = re.sub( f"\\]\\({re.escape(old_name)}\\)", f"](./image/{new_name})", content ) # 2. 带路径的引用 content = re.sub( f"\\]\\([^)]*{re.escape(old_name)}\\)", f"](./image/{new_name})", content ) # 3. URL编码的引用 encoded_name = unquote(old_name) if encoded_name != old_name: content = re.sub( f"\\]\\([^)]*{re.escape(encoded_name)}[^)]*\\)", f"](./image/{new_name})", content ) # 确保所有图片都指向./image/目录 content = re.sub( r'!\[([^\]]*)\]\((?!\.?/image/)([^)]+\.(jpg|jpeg|png|gif))\)', r'![\1](./image/\2)', content, flags=re.IGNORECASE ) if content != original_content: # 创建备份 backup_file = md_file.with_suffix('.md.bak') shutil.copy2(md_file, backup_file) # 保存更新 md_file.write_text(content, encoding='utf-8') print(f" ✓ 更新MD: {md_file.name}") except Exception as e: print(f" ✗ 更新MD失败 {md_file.name}: {e}") def create_index(order_class: str, image_dir: Path, total_count: int): """创建图片索引文件""" images = sorted(image_dir.glob("*.jpg")) # 分类 categories = { "设计图": [], "展示图": [], "效果图": [], "流程图": [], "场景图": [], "其他": [] } for img in images: name = img.name added = False for cat in ["设计图", "展示图", "效果图", "流程图", "场景图"]: if name.startswith(cat): categories[cat].append(name) added = True break if not added: categories["其他"].append(name) # 生成索引内容 content = f"""# {order_class}订单班 - 图片资源索引 **图片总数**: {len(images)} 张 **更新时间**: 2025-09-28 **状态**: ✅ 已完成规范化整理 ## 图片分类 """ for cat, files in categories.items(): if files: content += f"\n### {cat} ({len(files)}张)\n" for file in files: content += f"- {file}\n" content += """ ## 使用说明 ### Markdown引用格式 ```markdown ![图片描述](./image/图片名.jpg) ``` ### 注意事项 - 所有图片已统一为 .jpg 格式 - 图片位于 notion文稿/image/ 目录下 - Markdown文件已创建备份(.bak) """ # 保存索引 index_file = image_dir.parent / "图片索引.md" index_file.write_text(content, encoding='utf-8') print(f" ✓ 创建索引: {index_file.name}") if __name__ == "__main__": process_all_orders()