在python中将文件输入解析为变量



我有一个名为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])]

最新更新