我有一個名為input.txt.
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"
從這個檔案我需要創建另一個檔案output.txt。在這個檔案中,如果bytesize="8"theninfo被分成兩部分。
例如: 數字=“0x48A”位元組大小=“8”資訊=“0x00000000a18c3ba3”
然后輸出檔案將包含:
name="PNP_VXU_1_2_0_LOW" number="0x48A" info="0xa18c3ba3"
name="PNP_VXU_1_2_0_HIGH" number="0x4BC" info="0x00000000"
其中 0x4BC = 0x48A 0x32
這是當前代碼:
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')
output.txt對于此代碼:
number="0x12" info="0x00000012"
number="0xA5" info="0xbbae321f"
number="0xD7" info="0x00000000"
number="0x356" info="0x00000234"
number="0x48A" info="0xa18c3ba3"
number="0x4BC" info="0x00000000"
number="0x867" info="0x0b"
預期輸出:
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"
如果位元組大小為 8,我如何將LOW和HIGH添加到名稱中?
uj5u.com熱心網友回復:
使用您當前的代碼,您只需要使用正則運算式捕獲名稱并以您處理的相同方式將其添加到輸出中nums:
with open(infile_path, "r") as infile, open(outfile_path, "w") as outfile:
for s in infile:
r = re.match('name="(.*)" number="(.*)" bytesize="(.*)" info="(.*)"', s)
if r:
name, *numbers = r.groups()
num, bs, info = map(lambda x: int(x, 0), numbers)
l = len(r.group(3)) - 2
if bs == 8:
l = 8
names = (f'{name}_LOW', f'{name}_HIGH')
nums = (num, num 0x32)
infos = (info % (2**32), info // (2**32))
else:
names = (name, )
nums = (num, )
infos = (info, )
for name, num, info in zip(names, nums, infos):
outfile.write(f'name="{name}" number="{num:#x}" info="{info:#0{l 2}x}"\n')
uj5u.com熱心網友回復:
正則運算式在開始時被編譯以提高性能。
該process()函式分析輸入行并寫入輸出檔案。
PATTERN = re.compile(r'(\w*)="([^"]*)')
def process(line, f_out):
name, number, bytesize, info = [x[1] for x in PATTERN.findall(line)]
if int(bytesize) == 8:
n = int(number, 16) 0x32
f_out.writelines(
[
f'name="{name}_LOW" number="{number}" info="0x{info[-8:]}"\n',
f'name="{name}_HIGH" number="0x{n:02X}" info="{info[:10]}"\n'
]
)
else:
f_out.writelines(line)
with open("input.txt") as f_in, open("output.txt", "w") as f_out:
for line in f_in:
process(line, f_out)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/530953.html
上一篇:根據公共鍵合并字典串列
下一篇:了解xreadgroup命令
