Python适配行首空白场景批量修改pid值解决文件合并id冲突
原始脚本核心问题定位
- 行结构拆分逻辑硬编码适配了
"pid":在行首、无前置空白的场景,遇到带缩进的目标行时,split(" ")会把前置空白识别为第一个分割块,直接丢失原有格式、拆分错位 - 数字提取逻辑存在设计缺陷:直接抓取整行所有数字拼接成整数,一旦行内存在其他数字(比如同行动态字段的数值),会把无关数字和pid拼接成错误数值
- 格式破坏问题:修改pid行时强制在末尾追加逗号,会把原本没有末尾逗号的行强行加上不符合原始结构的标点,破坏文件可合并的兼容性
- 文件打开模式问题:用追加模式
'a'写输出,重复运行脚本时会反复向输出文件追加内容,导致文件冗余
修正实现思路
- 完全保留原始文件的所有格式细节,包括前置缩进、末尾标点、非目标行的全部内容,不做额外修改
- 用正则直接定位行内任意位置的
"pid":字段,精准抓取该字段对应的数值,不提取其他无关内容 - 对抓取到的pid值统一累加9000偏移,替换原位置的数值,保持字段前后的空白格式不变
- 输出文件采用写入模式,避免重复运行造成的内容重复
可直接运行的修正后代码
import re # 以写入模式打开输出文件,避免重复运行时内容重复堆积 with open('第二联赛_pid修正版.txt', 'w', encoding='utf-8') as output_f: # 读取待修改的原始第二联赛文件 with open('test5.txt', 'r', encoding='utf-8') as input_f: for line in input_f: # 正则匹配规则:匹配任意位置的"pid": 后跟任意数量空白、连续数字的结构 def calc_offset(match_obj): original_pid = int(match_obj.group(1)) return f'"pid": {original_pid + 9000}' # 仅替换匹配到的pid内容,行内其他所有内容(包括缩进、逗号、其他字段)原样保留 processed_line = re.sub(r'"pid":\s*(\d+)', calc_offset, line) output_f.write(processed_line)
适配特性说明
- 兼容任意行首缩进:不管目标行前面有多少空格、制表符,只要行内存在
"pid": 数值的结构,就能精准定位pid值,和缩进长度完全无关 - 不破坏原有格式:原行末尾的逗号、字段间的空格、其他无关字段的内容全部原样保留,不会出现原脚本强行加逗号、丢缩进的问题
- 数字提取精准:只抓取
"pid":字段对应的数值,不会把行内其他字段的数字混入计算,彻底解决原脚本把整行数字拼接的错误 - 兼容格式变体:自动识别pid字段后1个或多个空白间隔的场景,不需要严格匹配
"pid":(单个空格)的固定格式
效果对照(基于提供的测试样例)
- 原始行:
"pid": 5,→ 修正后:"pid": 9005, - 原始行:
"pid": 3000,→ 修正后:"pid": 12000, - 原始行:
"pid": 1024(无末尾逗号)→ 修正后:"pid": 10024(不额外追加逗号,和原格式一致) - 原始行:
"uakkdk": 585,→ 修正后原样输出,无任何改动
使用提示:运行前只需要把代码里的
test5.txt替换为自己的第二联赛原始文件路径,输出的第二联赛_pid修正版.txt就可以直接和第一联赛的文件合并,不会出现pid值重叠冲突。
内容的提问来源于stack exchange,提问作者Robert Williams
相关产品推荐
相关产品推荐

