解析两个文件并为每个id生成相应的字符串

2024-04-19 10:22:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个这样的文件:

p.txt

{1=[128, 12, 132], 2=[137, 1, 141, 5, 129, 9], 3=[2, 138, 6, 142]}

s.txt

{1=[200, 11, 987], 2=[765, 198, 31, 912, 234, 11], 3=[19, 12, 38, 60, 212]}

在上述两个文件中,我对每个客户机id都有主映射和次映射。例如clientId 1primary映射为128, 12, 132,将secondary映射为200, 11, 987。其他客户也一样。上述两个文件的格式应相同,并且两个文件的客户机标识号相同

现在基于以上两个文件,我需要为每个clientId创建一个这样的字符串,这样对于每个clientId,p和s的值都在那里。你知道吗

{"text":"For id 1.","p":[128, 12, 132],"s":[200, 11, 987]}
{"text":"For id 2.","p":[137, 1, 141, 5, 129, 9],"s":[765, 198, 31, 912, 234, 11]}
{"text":"For id 3.","p":[2, 138, 6, 142],"s":[19, 12, 38, 60, 212]}

最好的方法是什么?在bash中解析p.txts.txt会有点困难,因为它们不是有效的json。你知道吗


Tags: 文件方法字符串texttxtbashidfor
1条回答
网友
1楼 · 发布于 2024-04-19 10:22:07

可以使用ast.literal_eval将字符串转换为python对象。当然,您的输入在此之前需要进行一些修改—使用re模块,例如:

from ast import literal_eval
import re

p_str = "{1=[128, 12, 132], 2=[137, 1, 141, 5, 129, 9], 3=[2, 138, 6, 142]}"
s_str = "{1=[200, 11, 987], 2=[765, 198, 31, 912, 234, 11], 3=[19, 12, 38, 60, 212]}"

p_str = re.sub(r'(\d+)\=', r'"x\1":', p_str)
s_str = re.sub(r'(\d+)\=', r'"x\1":', s_str)
p_d = literal_eval(p_str)
s_d = literal_eval(s_str)

for k, v in p_d.items():
    print('{{"text": "For id {}.", "p":{},"s":{}}}'.format(k.lstrip('x'), v, s_d[k]))

这将打印:

{"text": "For id 1.", "p":[128, 12, 132],"s":[200, 11, 987]}
{"text": "For id 2.", "p":[137, 1, 141, 5, 129, 9],"s":[765, 198, 31, 912, 234, 11]}
{"text": "For id 3.", "p":[2, 138, 6, 142],"s":[19, 12, 38, 60, 212]}

要从文件加载,可以使用以下命令:

from ast import literal_eval
import re

with open('p.txt', 'r') as p_in, open('s.txt', 'r') as s_in:
    p_str = p_in.read()
    s_str = s_in.read()

p_str = re.sub(r'(\d+)\=', r'"x\1":', p_str)
s_str = re.sub(r'(\d+)\=', r'"x\1":', s_str)
p_d = literal_eval(p_str)
s_d = literal_eval(s_str)

for k, v in p_d.items():
    print('{{"text": "For id {}.", "p":{},"s":{}}}'.format(k.lstrip('x'), v, s_d[k]))

相关问题 更多 >