如何在bytesize为8时给文件中的字符串名称添加LOW/HIGH后缀
解决字段拆分与名称后缀添加的Python代码修改方案
需求说明
现有input.txt文件,每行包含name、number、bytesize、info四个字段,需生成output.txt文件,规则如下:
- 当
bytesize="8"时,将info拆分为低32位和高32位两部分,对应name分别添加_LOW和_HIGH后缀,同时第二行的number需递增0x32 - 当
bytesize不为8时,保持原字段输出
输入文件内容
name="XYZ_PP_0" number="0x12" bytesize="4" info="0x00000012" name="GK_LMP_2_0" number="0xA5" bytesize="8" info="0x00000000bbae321f" name="MP_LKO_1_0" number="0x356" bytesize="4" info="0x00000234" name="PNP_VXU_1_2_0" number="0x48A" bytesize="8" info="0x00000000a18c3ba3" name="AVU_W_2_3_1" number="0x867" bytesize="1" info="0x0b"
现有问题代码
import re infile_path = "./input.txt" outfile_path = "./output.txt" with open(infile_path, "r") as infile, open(outfile_path, "w") as outfile: for s in infile: r = re.match('number="(.*)" bytesize="(.*)" info="(.*)"', s) if r: num, bs, info = map(lambda x: int(x, 0), r.groups()) l = len(r.group(3)) - 2 if bs == 8: l = 8 nums = (num, num + 0x32) infos = (info % (2**32), info // (2**32)) else: nums = (num, ) infos = (info, ) for num, info in zip(nums, infos): outfile.write(f'number="{num:#x}" info="{info:#0{l+2}x}"\n')
预期输出
name="XYZ_PP_0" number="0x12" info="0x00000012" name="GK_LMP_2_0_LOW" number="0xA5" info="0xbbae321f" name="GK_LMP_2_0_HIGH" number="0xD7" info="0x00000000" name="MP_LKO_1_0" number="0x356" info="0x00000234" name="PNP_VXU_1_2_0_LOW" number="0x48A" info="0xa18c3ba3" name="PNP_VXU_1_2_0_HIGH" number="0x4BC" info="0x00000000" name="AVU_W_2_3_1" number="0x867" info="0x0b"
修改后的完整代码
import re infile_path = "./input.txt" outfile_path = "./output.txt" # 调整正则表达式,捕获完整的四个字段 pattern = re.compile(r'name="(.*?)" number="(.*?)" bytesize="(.*?)" info="(.*?)"') with open(infile_path, "r") as infile, open(outfile_path, "w") as outfile: for line in infile: line = line.strip() if not line: continue match = pattern.match(line) if match: name, num_str, bs_str, info_str = match.groups() num = int(num_str, 0) bs = int(bs_str, 0) info = int(info_str, 0) if bs == 8: # 拆分info为低32位和高32位 low_info = info & 0xFFFFFFFF high_info = info >> 32 # 准备后缀、编号和对应info数据 name_suffixes = ["_LOW", "_HIGH"] nums = [num, num + 0x32] infos = [low_info, high_info] # 循环生成两行输出 for suffix, current_num, current_info in zip(name_suffixes, nums, infos): formatted_info = f"0x{current_info:08x}" outfile.write(f'name="{name}{suffix}" number="{current_num:#x}" info="{formatted_info}"\n') else: # 非8字节场景,直接保留原格式输出 outfile.write(f'name="{name}" number="{num:#x}" info="{info_str}"\n')
关键修改点
- 正则表达式优化:新增
name字段的捕获逻辑,确保能提取每行完整的四个字段信息 - 名称后缀处理:针对
bytesize=8的行,为原名称添加_LOW和_HIGH后缀,对应拆分后的info数据 - info格式修正:拆分后的info统一格式化为8位十六进制字符串,匹配预期输出样式
- 字段顺序保留:输出时保持
name、number、info的顺序,与输入格式一致 - 空行过滤:跳过输入中的空行,避免无效输出内容
内容的提问来源于stack exchange,提问作者V_S
相关产品推荐
相关产品推荐

