2014-06-25 35 views
0

我有一個問題,我無法用python解決,它可能很愚蠢,但我沒有設法找到自己的解決方案。用多個字典打開.json文件

我有一個存儲模擬結果的.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

逐行讀取文件並將每行解析爲JSON。 – poke

回答

1

我會建議逐行讀取文件並將每一行獨立轉換爲字典。

您可以每行放入用下面的代碼清單:

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

如果更改輸入文件格式是一個選項,我會建議將它改爲適當的JSON對象數組。 – poke

+0

@Lix我想,格式已經是逐行組織了。 –

+1

你可以在文件句柄上做列表理解 –

-2

這不是有效的JSON 。你不能在頂層有多個對象,沒有在列表中包含它們並在它們之間插入逗號。

2

如果您的輸入數據與提供的數據完全一致,那麼您應該能夠使用json.load來解釋每個單獨的字典。如果各詞典是對自己的行那麼這應該足夠了:

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

{...} {...}是不妥當的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) 

這應該工作,即使你的詞典是不是在單獨的行。