【发布时间】:2016-07-14 05:35:21
【问题描述】:
我正在尝试设置一个简单的数据文件格式,并且我正在 Python 中使用这些文件进行分析。格式基本上由标题信息组成,然后是数据。出于语法和未来可扩展性的原因,我想使用 JSON 对象作为标头信息。示例文件如下所示:
{
"name": "my material",
"sample-id": null,
"description": "some material",
"funit": "MHz",
"filetype": "material_data"
}
18 6.269311533 0.128658208 0.962033017 0.566268827
18.10945274 6.268810641 0.128691962 0.961950095 0.565591807
18.21890547 6.268312637 0.128725463 0.961814928 0.564998228...
如果数据长度/结构始终相同,则不难解析。然而,它在我的脑海中提出了一个关于解析 JSON 对象的最灵活方法的问题,给定未知数量的行,未知数量的嵌套花括号,以及文件中可能有多个 JSON 对象。
如果文件中只有一个 JSON 对象,可以使用这个正则表达式:
with open(fname, 'r') as fp:
fstring = fp.read()
json_string = re.search('{.*}', fstring, flags=re.S)
但是,如果有多个 JSON 字符串,并且我想抓取第一个,我需要使用这样的东西:
def grab_json(mystring):
lbracket = 0
rbracket = 0
lbracket_pos = 0
rbracket_pos = 0
for i in range(len(mystring)):
if mystring[i] == '{':
lbracket = 1
lbracket_pos = i
break
for i in range(lbracket_pos+1, len(mystring)):
if mystring[i] == '}':
rbracket += 1
if rbracket == lbracket:
rbracket_pos = i
break
elif mystring[i] == '{':
lbracket += 1
json_string = mystring[lbracket_pos : rbracket_pos + 1]
return json_string, lbracket_pos, rbracket_pos
json_string, beg_pos, end_pos = grab_json(fstring)
我猜这个问题一如既往:有没有更好的方法来做到这一点?更好的意思是更简单的代码、更灵活的代码、更健壮的代码或其他任何东西?
【问题讨论】:
-
对所有数据使用 JSON,每个文件一个 JSON 结构。