0

だから私はPythonでJSONファイルを解析しようとしています。スクリプトを実行するたびに出力が得られ、その[]理由について非常に混乱しています。これは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  
4

1 に答える 1

8

私の最善の推測は、それ自体が有効な 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
}

次に、別のアプローチを使用する必要があります: アイテムを 1 つずつデコードします。残念ながら、データをストリーミングすることはできないため、最初にすべてのデータを一度にロードする必要があります。

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 を頻繁に解析するよりも頻繁にデータにアクセスする方が、データへのアクセスが高速になる可能性があります。

于 2013-06-26T04:10:05.880 に答える