我有一个名为input.txt的文本文件,其内容如下:
landmark {
x: 0.48397088050842285
y: 0.25201746821403503
z: -0.285147100687027
visibility: 0.9999984502792358
}
landmark {
x: 0.4912211298942566
y: 0.23858927190303802
z: -0.27364951372146606
visibility: 0.9999926090240479
}
landmark {
x: 0.4947235584259033
y: 0.23917287588119507
z: -0.27369818091392517
visibility: 0.9999934434890747
}
如何编写一个函数,将每个值放入列表的列表中?例如:list[0] = {0.48397,0.252017,-0.28514,0.999999} list[1] ={0.491221,0.2385892,-0.27364,0.999992}等等.
假设格式没有偏离,一个非常幼稚的方法将是一大堆正则表达式替换,将其变成它看起来的样子:一个字典列表,然后ast.literal_eval
它。我没有处理的后面的逗号实际上把它包装成一个单元素元组,因此是[0]
。
import ast
import re
ast.literal_eval(
re.sub(r'(d)s', r'1,',
re.sub(r'}s*landmarks*{', '},{',
re.sub(r'$', ',',
re.sub(r'}s*Z', '}]',
re.sub(r'Alandmarks*{', '[{',
re.sub(r'([a-zA-Z]+):', r'"1":', s))))))
)[0]
这是我不使用regx的方法
s = """landmark {
x: 0.48397088050842285
y: 0.25201746821403503
z: -0.285147100687027
visibility: 0.9999984502792358
}
landmark {
x: 0.4912211298942566
y: 0.23858927190303802
z: -0.27364951372146606
visibility: 0.9999926090240479
}
landmark {
x: 0.4947235584259033
y: 0.23917287588119507
z: -0.27369818091392517
visibility: 0.9999934434890747
}"""
d= [i.replace('{n','').replace('}n','').replace('n',',').replace(',}','') for i in s.split('landmark') if i]
t = [i.replace('x','"x"').replace('z','"z"').replace('visibility','"k"').replace('y','"y"').replace('k','visibility') for i in d]
[eval('{'+i+'}').values() for i in t ]
#Your output:
[dict_values([0.48397088050842285, 0.25201746821403503, -0.285147100687027, 0.9999984502792358]),
dict_values([0.4912211298942566, 0.23858927190303802, -0.27364951372146606, 0.9999926090240479]),
dict_values([0.4947235584259033, 0.23917287588119507, -0.27369818091392517, 0.9999934434890747])]