2015-12-25 26 views
5

Python 2.7でjsonライブラリを使用してJSON複数行ファイルを解析しようとしています。単純化されたサンプルファイルは以下の通りである:次のようにPythonを使用して複数行JSONファイルを解析する問題

{ 
"observations": { 
    "notice": [ 
     { 
      "copyright": "Copyright Commonwealth of Australia 2015, Bureau of Meteorology. For more information see: http://www.bom.gov.au/other/copyright.shtml http://www.bom.gov.au/other/disclaimer.shtml", 
      "copyright_url": "http://www.bom.gov.au/other/copyright.shtml", 
      "disclaimer_url": "http://www.bom.gov.au/other/disclaimer.shtml", 
      "feedback_url": "http://www.bom.gov.au/other/feedback" 
     } 
    ] 
} 
} 

私のコードは次のとおりです。以下に示すように

import json 

with open('test.json', 'r') as jsonFile: 
    for jf in jsonFile: 
     jf = jf.replace('\n', '') 
     jf = jf.strip() 
     weatherData = json.loads(jf) 
     print weatherData 

はそれにもかかわらず、私はエラーを取得する:

Traceback (most recent call last): 
File "test.py", line 8, in <module> 
weatherData = json.loads(jf) 
File "/home/usr/anaconda2/lib/python2.7/json/__init__.py", line 339, in loads 
return _default_decoder.decode(s) 
File "/home/usr/anaconda2/lib/python2.7/json/decoder.py", line 364, in decode 
obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
File "/home/usr/anaconda2/lib/python2.7/json/decoder.py", line 380, in raw_decode 
obj, end = self.scan_once(s, idx) 
ValueError: Expecting object: line 1 column 1 (char 0) 

ただ、いくつかのテストを行うには改行を取り除いて先頭と末尾の空白を取り除いた後、別のファイル(拡張子はjson)に内容を書き込むようにコードを修正しました。驚いたことに、私が後者のファイルを読み返すと、私は何のエラーも得られず、解析は成功です。 jsonライブラリを使用する前に取り除かれたときに、新しいラインと白のスペースに行くかもしれないもの

{u'observations': {u'notice': [{u'copyright_url': u'http://www.bom.gov.au/other/copyright.shtml', u'disclaimer_url': u'http://www.bom.gov.au/other/disclaimer.shtml', u'copyright': u'Copyright Commonwealth of Australia 2015, Bureau of Meteorology. For more information see: http://www.bom.gov.au/other/copyright.shtml http://www.bom.gov.au/other/disclaimer.shtml', u'feedback_url': u'http://www.bom.gov.au/other/feedback'}]}} 

任意のアイデアを次のように

import json 

filewrite = open('out.json', 'w+') 

with open('test.json', 'r') as jsonFile: 
    for jf in jsonFile: 
     jf = jf.replace('\n', '') 
     jf = jf.strip() 
     filewrite.write(jf) 

filewrite.close() 

with open('out.json', 'r') as newJsonFile: 
    for line in newJsonFile: 
     weatherData = json.loads(line) 
     print weatherData 

出力は次のとおりです。次のように変更されたコードはありますか?

答えて

4

あなたは狂気を移動します。 jsonモジュールには、直接または文字列、すなわちloadloadsメソッドを読み込むためのヘルパメソッドがあります。 loadは、jsonデータを含むファイルに対してファイルオブジェクト(以下に示す)をとります。loadsは、jsonデータを含む文字列を取ります。

オプション1: - 優先

import json 
with open('test.json', 'r') as jf: 
    weatherData = json.load(jf) 
    print weatherData 

オプション2:あなたは、より高性能のJSONの解析を探しているなら

import json 
with open('test.json', 'r') as jf: 
    weatherData = json.loads(jf.read()) 
    print weatherData 

ujson

+1

ありがとう@OkezieE。 'load'を介してファイル全体をロードすることは、そのトリックを行います。 – hypersonics

5

最初のスニペットでは、1行ずつ解析しようとしています。一度にすべてを解析する必要があります。最も簡単な方法はjson.load(jsonfile)です。 (jfの変数名は文字列であるため誤解を招きます)。だから、正しい方法は、それを解析します

import json 

with open('test.json', 'r') as jsonFile: 
    weatherData = json.loads(jsonFile) 

を、それはより簡潔だとして、それは、1行でJSONを保管することをお勧めしますが。

2番目のスニペットでは、ユニコード文字列(u'string here')が、python固有のユニコード文字列として表示されるという問題があります。有効なJSONあなたは、単一のwith文で開かれたファイルの両方を持つことができ、

+0

をチェックアウト、私はロードのあなたのアプローチを試してみましたファイル全体と一度にすべての構文解析ができますが、失敗します。ちなみに、私はjsonファイルを問題なく処理することを試みましたが、各辞書は約100文字を超えることはないと考えています。 – hypersonics

+0

あなたが提供したjsonでうまくいきました。jsonを前後に変換するためにSublime JSONプラグインを使用してみてください:https://github.com/dzhibas/SublimePrettyJsonそれはまたjsonを検証するので、さらに問題を調査することができます。より詳細なlintingについては、http://jsonlint.com/ – fodma1

1

FYI二重引用符を使用しています:あなたはラインによってJSONファイルの行を解析しようとした場合

with open('file_A') as in_, open('file_B', 'w+') as out_: 
    # logic here 
    ... 
+0

を参照してください。このコードは質問に答えるかもしれませんが、それが何をしているのかを説明し、それにいくつかの参照を追加する方が良いでしょう。 – dotctor

+1

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューから](/レビュー/低品質の投稿/ 10682568) –

+0

@James:agree。回答の瞬間に私は質問にコメントすることができなかったし、今upvoteに感謝します:-) –

関連する問題