Skill: llyouc/extract-pic-text (version 1.0.0)

--- name: extract-pic-text description: 从图片文件名中提取指定位置的文本内容。支持自定义分隔符和提取位置，可批量处理目录中的图片文件。适用于需要从规范化命名的图片中提取ID、编号、日期等信息的场景。Use when: (1) 需要从图片文件名中提取特定位置的文本, (2) 批量处理命名规范的图片文件, (3) 提取文件名中的ID、编号、日期等信息。 metadata: openclaw: emoji: 🖼️ requires: bins: [python3] --- # extract-pic-text 从图片文件名中提取指定位置的文本内容。支持自定义分隔符、提取位置，可批量处理目录中的图片文件。 ## 功能特点 - 支持自定义分隔符（默认为 `_`） - 支持指定提取位置（默认为第2部分，即第一个和第二个分隔符之间的内容） - 支持多种图片格式（jpg, jpeg, png, gif, bmp, webp, tiff, tif） - 可自定义图片扩展名列表 - 支持结果排序和去重 - 可输出到文件或 stdout ## 用法 ### 基本用法 ```bash # 提取默认位置（第一个和第二个下划线之间的文本） python3 scripts/extract_pic_text.py /path/to/images # 示例：BIN245_515194318_0128N.jpg -> 515194318 ``` ### 高级选项 ```bash # 使用不同的分隔符和位置 python3 scripts/extract_pic_text.py /path/to/images -d '-' -p 0 # 示例：img-12345-test.jpg -> img (位置0) # 指定图片扩展名 python3 scripts/extract_pic_text.py /path/to/images -e .jpg .png # 结果排序并去重 python3 scripts/extract_pic_text.py /path/to/images --sort --unique # 保存到文件 python3 scripts/extract_pic_text.py /path/to/images -o result.txt ``` ### 完整参数说明 | 参数 | 简写 | 说明 | 默认值 | |------|------|------|--------| | `directory` | - | 图片所在目录路径（必填） | - | | `--delimiter` | `-d` | 文件名分隔符 | `_` | | `--position` | `-p` | 提取位置（0开始） | `1` | | `--extensions` | `-e` | 图片扩展名列表 | `.jpg .jpeg .png .gif .bmp .webp .tiff .tif` | | `--output` | `-o` | 输出文件路径 | stdout | | `--sort` | - | 对结果排序 | False | | `--unique` | - | 去重 | False | ## 提取规则示例 假设分隔符为 `_`，位置为 `1`： | 文件名 | 提取结果 | |--------|----------| | `BIN245_515194318_0128N.jpg` | `515194318` | | `abc_def_ghi.png` | `def` | | `2024_0307_event.jpg` | `0307` | | `product_SKU123_detail.jpg` | `SKU123` | ## 输出格式 ``` 515194318,515196709,515270355 注意：2个文件格式不符：invalid_file.jpg, no_underscore.png ``` ## 使用场景 1. **图片处理**：从 `SKU_12345_variant.jpg` 中提取 SKU 编号 2. **照片管理**：从 `2024_0307_event.jpg` 中提取日期 3. **批量重命名辅助**：提取现有文件名中的关键信息 4. **数据整理**：从规范化命名的图片中提取ID进行数据库比对 ## 脚本路径 ``` scripts/extract_pic_text.py ``` 在 skill 目录下可直接执行： ```bash python3 ~/.openclaw/workspace/skills/extract-pic-text/scripts/extract_pic_text.py /path/to/images ```

path: scripts/extract_pic_text.py
content: #!/usr/bin/env python3
"""
extract-pic-text: 从图片文件名中提取指定位置的文本

功能：遍历指定目录下的所有图片文件，根据分隔符提取文件名中的特定部分
"""

import os
import sys
import argparse
from pathlib import Path


def extract_text_from_filename(filename, delimiter='_', position=1):
    """
    从文件名中提取指定位置的文本
    
    Args:
        filename: 文件名（不含路径）
        delimiter: 分隔符，默认为 '_'
        position: 要提取的部分索引，1表示第一个分隔符后、第二个分隔符前的内容
    
    Returns:
        提取的文本，如果格式不符返回 None
    """
    # 移除文件扩展名
    name = Path(filename).stem
    
    # 按分隔符分割
    parts = name.split(delimiter)
    
    # 检查是否有足够的部分
    if len(parts) <= position:
        return None
    
    # 返回指定位置的内容
    return parts[position]


def process_directory(directory, delimiter='_', position=1, extensions=None):
    """
    处理目录中的所有图片文件
    
    Args:
        directory: 要扫描的目录路径
        delimiter: 文件名分隔符
        position: 提取位置
        extensions: 图片扩展名列表，None表示使用默认列表
    
    Returns:
        (成功提取的列表, 格式不符的文件列表)
    """
    if extensions is None:
        extensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.tiff', '.tif']
    
    # 转换为小写以便比较
    extensions = [ext.lower() for ext in extensions]
    
    extracted_values = []
    invalid_files = []
    
    try:
        # 遍历目录
        for filename in os.listdir(directory):
            filepath = os.path.join(directory, filename)
            
            # 跳过子目录
            if os.path.isdir(filepath):
                continue
            
            # 检查扩展名
            file_ext = Path(filename).suffix.lower()
            if file_ext not in extensions:
                continue
            
            # 提取文本
            value = extract_text_from_filename(filename, delimiter, position)
            
            if value is not None:
                extracted_values.append(value)
            else:
                invalid_files.append(filename)
    
    except Exception as e:
        print(f"错误: 无法读取目录 '{directory}': {e}", file=sys.stderr)
        sys.exit(1)
    
    return extracted_values, invalid_files


def main():
    parser = argparse.ArgumentParser(
        description='从图片文件名中提取指定位置的文本',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例:
  %(prog)s /path/to/images
  %(prog)s /path/to/images -d '-' -p 0
  %(prog)s /path/to/images --extensions .jpg .png

文件名示例 (默认分隔符 '_'，位置 1):
  BIN245_515194318_0128N.jpg  ->  515194318
  abc_def_ghi.png             ->  def
        """
    )
    
    parser.add_argument('directory', help='图片所在目录路径')
    parser.add_argument('-d', '--delimiter', default='_',
                        help='文件名分隔符 (默认: _)')
    parser.add_argument('-p', '--position', type=int, default=1,
                        help='要提取的部分位置，0为第一部分，1为第二部分 (默认: 1)')
    parser.add_argument('-e', '--extensions', nargs='+',
                        default=['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.tiff', '.tif'],
                        help='图片扩展名列表 (默认: .jpg .jpeg .png .gif .bmp .webp .tiff .tif)')
    parser.add_argument('-o', '--output', help='输出文件路径 (默认输出到stdout)')
    parser.add_argument('--sort', action='store_true',
                        help='对结果进行排序')
    parser.add_argument('--unique', action='store_true',
                        help='去重')
    
    args = parser.parse_args()
    
    # 验证目录
    if not os.path.isdir(args.directory):
        print(f"错误: 目录不存在 '{args.directory}'", file=sys.stderr)
        sys.exit(1)
    
    # 处理文件
    extracted, invalid = process_directory(
        args.directory,
        delimiter=args.delimiter,
        position=args.position,
        extensions=args.extensions
    )
    
    # 排序和去重
    if args.sort:
        extracted.sort()
    if args.unique:
        seen = set()
        unique_list = []
        for x in extracted:
            if x not in seen:
                seen.add(x)
                unique_list.append(x)
        extracted = unique_list
    
    # 生成输出
    lines = []
    if extracted:
        lines.append(','.join(extracted))
    
    if invalid:
        if lines:
            lines.append('')
        lines.append(f"注意：{len(invalid)}个文件格式不符：{', '.join(invalid)}")
    
    output = '\n'.join(lines)
    
    # 输出结果
    if args.output:
        with open(args.output, 'w', encoding='utf-8') as f:
            f.write(output + '\n')
        print(f"结果已保存到: {args.output}")
    else:
        print(output)
    
    # 统计信息
    print(f"\n统计: 成功提取 {len(extracted)} 个, 格式不符 {len(invalid)} 个", file=sys.stderr)


if __name__ == '__main__':
    main()


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)