You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3多文档工单键子串数字增量更新脚本优化咨询

Ticket Key批量更新脚本优化方案

现有代码核心问题梳理

  • 正则采用消耗型匹配\W,会吃掉匹配项前后的非单词字符,同时无法匹配位于文本开头/结尾的ticket key,是漏匹配的核心原因
  • 正则\w+允许前缀包含数字、下划线,会误匹配UTF-8这类非ticket格式的字符串;同时未限制短横线数量,遇到ABC-DEF-123这类多短横线字符串时split('-')会直接报错
  • 文件遍历未拼接完整路径,指定非当前工作目录时会找不到文件;未跳过子目录,会触发打开目录的异常
  • 无备份机制,修改出错无法回滚;未指定文件编码,非UTF-8编码文件会出现乱码、读取失败问题
  • with上下文管理器内重复手动关闭文件,属于冗余操作

优化实现方案

核心优化点

  1. 正则改用零宽断言,不消耗前后字符,同时限制ticket前缀仅为英文字母、仅允许单条短横线,彻底解决误匹配、漏匹配问题
  2. 新增自动备份逻辑,修改前自动生成.ticket_bak后缀的原文件备份
  3. 优化文件遍历逻辑,自动拼接完整路径、跳过子目录
  4. 新增异常捕获、编码指定,兼容不同格式的文本文件
  5. 替换逻辑增加校验,不符合拆分规则的匹配项直接返回原内容,避免报错

完整优化代码

import re
import sys
import os
import shutil

# 可根据需求调整增量值
INCREMENT_VAL = 3000
# 备份文件后缀,避免重复处理
BACKUP_SUFFIX = ".ticket_bak"
# 匹配规则:零宽断言确保前后不是单词字符,前缀仅为英文字母,单条短横线,后缀为数字
TICKET_PATTERN = re.compile(r'(?<!\w)([A-Za-z]+-\d+)(?!\w)')

def increment_ticket(match_obj):
    raw_ticket = match_obj.group(1)
    try:
        key, num_str = raw_ticket.split('-')
        new_num = int(num_str) + INCREMENT_VAL
        return f"{key}-{new_num}"
    except (ValueError, IndexError):
        # 拆分/转换失败直接返回原内容,不做修改
        return raw_ticket

def process_file(file_path):
    # 跳过备份文件和子目录
    if file_path.endswith(BACKUP_SUFFIX) or not os.path.isfile(file_path):
        return
    # 自动备份原文件
    backup_path = f"{file_path}{BACKUP_SUFFIX}"
    if not os.path.exists(backup_path):
        shutil.copy2(file_path, backup_path)
    # 读取文件内容
    try:
        with open(file_path, 'r', encoding='utf-8', errors='replace') as f:
            content = f.read()
    except Exception as e:
        print(f"读取文件{file_path}失败:{str(e)}")
        return
    # 替换ticket key
    new_content = TICKET_PATTERN.sub(increment_ticket, content)
    # 内容有变更才写回
    if new_content != content:
        try:
            with open(file_path, 'w', encoding='utf-8', errors='replace') as f:
                f.write(new_content)
            print(f"已处理文件:{file_path}")
        except Exception as e:
            print(f"写入文件{file_path}失败:{str(e)}")
            # 写入失败自动恢复原文件
            shutil.copy2(backup_path, file_path)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("使用方式:python ticket_increment.py <目标目录路径>")
        sys.exit(1)
    target_dir = sys.argv[1]
    if not os.path.isdir(target_dir):
        print(f"错误:{target_dir} 不是有效目录")
        sys.exit(1)
    # 遍历处理目录下所有文件
    for filename in os.listdir(target_dir):
        file_path = os.path.join(target_dir, filename)
        process_file(file_path)

使用说明

  • 运行前请确认INCREMENT_VAL配置的增量值符合需求
  • 脚本会自动为修改过的文件生成后缀为.ticket_bak的备份,确认修改无误后可自行删除备份文件
  • 脚本默认跳过备份文件、子目录,不会重复处理备份内容
  • 对文件格式无要求,任意文本类文件(XML、JSON、TXT等)均可适配,仅修改符合规则的ticket key,其余内容完全保留

内容的提问来源于stack exchange,提问作者Hamsandwhich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 05:30:01