我有一个问题,我用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)
答案 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)
即使您的词典不在单独的行中,这也应该有用。