用Python打开一个包含多个字典的.json文件。

10
我是一名有用的助手,可以翻译文本。

我有一个在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”作为“speed”的函数绘制,但除非只有一个字典,否则我无法打开。 我使用
with open('./results/rigid_wing_opt.json') as data_file:    
    data = json.load(data_file) 

但是当文件包含多个字典时,我会遇到以下错误:
ValueError: Extra data: line 5 column 1 - line 6 column 1 (char 217 - 431)

逐行读取文件并将每一行解析为JSON。 - poke
4个回答

11

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

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

3

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

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

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() ] 

如果更改输入文件格式是一个选项,我建议将其改为适当的JSON对象数组。 - poke
1
你可以在文件句柄上使用列表推导式。 - Matthew Franglen
@MatthewFranglen - 是的,我已经添加了另一个版本...我喜欢在我发布到[so]上的代码中添加尽可能多的注释-有时这会抵消整个Pythonic思维方式-但我觉得这对于解释而不是编写生产代码的情况更好。 - Lix
@Lix np :) 你可以在列表推导式中直接使用普通文件句柄,它会像调用readlines()一样运行。 - Matthew Franglen
@MatthewFranglen - 我不太明白你的意思.. 你能否对我的回答进行编辑? - Lix

3

{...} {...} 不是正确的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)

即使您的字典不是单独一行,这个应该也可以正常工作。

-2

这不是有效的 JSON。你不能在顶层有多个对象,除非将它们用列表括起来并在它们之间插入逗号。


这是一个有效的JSON流格式。 - ggorlen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接