Files
n8n_Demo/scripts/fix_all_orders_images.py

250 lines
8.0 KiB
Python
Raw Permalink Normal View History

#!/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()