2013-06-26 229 views
0

所以我想用Python解析JSON文件。每次運行我的腳本時,我都會得到[]的輸出結果,我對此很困惑。這甚至是一個正確的方法來解析JSON在python中?用Python解析JSON文件

這裏是我的代碼:

import sys 
import simplejson 
import difflib 

filename = sys.argv[1] 

data = [] 

f = file('output.json', "r") 
lines = f.readlines() 
for line in lines: 
     try: 
      loadLines = simplejson.loads(line) 

      data.append(loadLines['executionTime']) 

     except ValueError: 
      pass 


print data 
+1

@MattBall它與文件的大小無關。 – JBernardo

+0

你們可以幫忙嗎? – metersk

+0

@Jernernardo確實,雖然標題暗示大小是問題。 –

回答

7

我最好的猜測是對自己沒有行是有效的JSON。這將導致每次拋出ValueError,並且您將永遠不會到達data.append(...),因爲當時一直拋出異常。

如果整個文件是一個JSON數組是這樣的:

[ 
    { 
     "direction": "left", 
     "time": 1 
    }, 
    { 
     "direction": "right", 
     "time": 2 
    } 
] 

然後,你可以簡單地使用類似:

with open('output.json', 'r') as f: 
    data = json.load(f) 

然而,如果它在的JSON物品一堆頂層,沒有被封閉在一個JSON對象或數組中,像這樣:

{ 
    "direction": "left", 
    "time": 1 
} 
{ 
    "direction": "right", 
    "time": 2 
} 

那麼你將不得不去與一個不同的方法:逐項解碼項目。不幸的是,我們不能流中的數據,所以我們首先必須加載在一旦所有的數據:

with open('output.json', 'r') as f: 
    json_data = f.read() 

要分析一個項目,我們使用decode_raw。這意味着我們需要一個JSONDecoder

decoder = json.JSONDecoder() 

然後我們就一起去,剝離在串左側的任何空白,檢查,以確保我們仍然有項目,並分析項目:

while json_data.strip(): # while there's still non-whitespace... 
    # strip off whitespace on the left side of the string 
    json_data = json_data.lstrip() 
    # and parse an item, setting the new data to be whatever's left 
    item, json_data = decoder.parse_raw(json_data) 
    # ...and then append that item to our list 
    data.append(item) 

如果你正在做大量的數據採集這樣的,它可能是值得將其存儲在數據庫中。像SQLite這樣簡單的事情可以做得很好。一個數據庫可以更容易地以有效的方式進行彙總統計。 (這就是它們的設計目的!)如果你經常使用這些數據,它可能會讓訪問數據的速度更快,而不是解析JSON。

+0

你能解釋一下這是什麼意思嗎? 「但是,如果它是頂層的一堆JSON項目,而不是包含在JSON對象或數組中,那麼您將不得不採用不同的方法。」 我製作了JSON文件,輸出這個鏈接bikenyc.com/stations/json每分鐘用一個python腳本和終端 – metersk

+0

@ user1887261:我已經添加了一個示例來顯示不同之處。請注意,第一個被'['和']'包圍,並且用逗號分隔各個項目,而後者沒有。 – icktoofay

+0

啊,好吧,編輯現在更有意義!謝謝。所以我的JSON被格式化爲最底層的代碼。我在哪裏開始制定基於此的不同方法? – metersk