Python3多文档工单键子串数字增量更新脚本优化咨询
Ticket Key批量更新脚本优化方案
现有代码核心问题梳理
- 正则采用消耗型匹配
\W,会吃掉匹配项前后的非单词字符,同时无法匹配位于文本开头/结尾的ticket key,是漏匹配的核心原因 - 正则
\w+允许前缀包含数字、下划线,会误匹配UTF-8这类非ticket格式的字符串;同时未限制短横线数量,遇到ABC-DEF-123这类多短横线字符串时split('-')会直接报错 - 文件遍历未拼接完整路径,指定非当前工作目录时会找不到文件;未跳过子目录,会触发打开目录的异常
- 无备份机制,修改出错无法回滚;未指定文件编码,非UTF-8编码文件会出现乱码、读取失败问题
- with上下文管理器内重复手动关闭文件,属于冗余操作
优化实现方案
核心优化点
- 正则改用零宽断言,不消耗前后字符,同时限制ticket前缀仅为英文字母、仅允许单条短横线,彻底解决误匹配、漏匹配问题
- 新增自动备份逻辑,修改前自动生成
.ticket_bak后缀的原文件备份 - 优化文件遍历逻辑,自动拼接完整路径、跳过子目录
- 新增异常捕获、编码指定,兼容不同格式的文本文件
- 替换逻辑增加校验,不符合拆分规则的匹配项直接返回原内容,避免报错
完整优化代码
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
相关产品推荐
相关产品推荐

