打开包含多个词典的.json文件

时间:2014-06-25 15:30:09

标签: python

我有一个问题,我用python无法解决,它可能非常愚蠢,但我没有设法自己找到解决方案。

我有一个.json文件,其中存储了模拟的结果。结果存储为一系列词典,如

{"F_t_in_max": 709.1800264942982, "F_t_out_max": 3333.1574129603068, "P_elec_max": 0.87088836042046958, "beta_max": 0.38091242406098391, "r0_max": 187.55175182942901, "r1_max": 1354.8636763521174, " speed ": 8}
{"F_t_in_max": 525.61428305710433, "F_t_out_max": 2965.0538075438467, "P_elec_max": 0.80977406754203796, "beta_max": 0.59471606595464666, "r0_max": 241.25371753877008, "r1_max": 688.61786996066826, " speed ": 9}
{"F_t_in_max": 453.71124051199763, "F_t_out_max": 2630.1763649193008, "P_elec_max": 0.64268078173342935, "beta_max": 1.0352896471221695, "r0_max": 249.32706230502498, "r1_max": 709.11415981343885, " speed ": 10}

我想打开文件并访问值,例如将“r0_max”绘制为“速度”的函数,但除非只有一个字典,否则无法打开。 我用

with open('./results/rigid_wing_opt.json') as data_file:    
    data = json.load(data_file) 

但是当文件包含多个字典时,我收到错误

ValueError:额外数据:第5行第1行 - 第6行第1列(字符217 - 431)

4 个答案:

答案 0 :(得分:5)

如果您的输入数据与提供的完全一致,那么您应该能够使用json.load解释每个字典。如果每个字典都在自己的行上,那么这应该足够了:

with open('filename', 'r') as handle:
    json_data = [json.loads(line) for line in handle]

答案 1 :(得分:2)

我建议逐行阅读文件并将每一行独立转换为字典。

您可以使用以下代码将每行放入列表中:

import ast
# Read all lines into a list
with open(fname) as f:
    content = f.readlines()

# Convert each list item to a dict
content = [ ast.literal_eval( line ) for line in content ]

或者是在同一行上执行列表理解的更短版本:

import ast
# Read all lines into a list
with open(fname) as f:
    content = [ ast.literal_eval( l ) for l in f.readlines() ] 

答案 2 :(得分:0)

这不是有效的JSON。你不能在顶层有多个obje,不能用列表包围它们并在它们之间插入逗号。

答案 3 :(得分:0)

{...} {...}不适合json。它是由空格分隔的两个json对象。除非你可以改变输入文件的格式来纠正这个问题,否则我建议你尝试一些不同的东西。如果数据很简单,那么您可以执行以下操作:

with open('filename', 'r') as handle:
    text_data = handle.read()
    text_data = '[' + re.sub(r'\}\s\{', '},{', text_data) + ']'
    json_data = json.loads(text_data)

即使您的词典不在单独的行中,这也应该有用。