2016-05-23 13 views
1

私はちょうどサイドプロジェクトに取り組んでおり、jsonモジュールがテキストファイルに格納されたjsonオブジェクトを解析するのに問題があります。テキストファイルには改行で区切られたjsonオブジェクトのリストが含まれています。これまでPython json.loadsがjsonの文字列を解析できません

、私はその後json.loads()にそれを送り、私は各フルJSONラインを取得している確認してきた、このコードを持っている:私はこれを実行すると

def load_save_game(file_name): 
    save_game = [] 
    with open(file_name) as f: 
     for line in f.readline(): 
      save_game.append(json.loads(line)) 
    return save_game 

が、私はかなり長いトレースバックを得る:

Traceback (most recent call last): 
    File ____, line 70, in <module> 
    main() 
    File ____, line 66, in main 
    view = ViewerWindow(load_save_game('played/20_05_2016 16-04-31.txt')) 
    File ____, line 60, in load_save_game 
    save_game.append(json.loads(line)) 
    File "C:\Python27\lib\json\__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "C:\Python27\lib\json\decoder.py", line 366, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "C:\Python27\lib\json\decoder.py", line 382, in raw_decode 
    obj, end = self.scan_once(s, idx) 
ValueError: Expecting object: line 1 column 1 (char 0) 

私は問題はエンコーディングに関係することができると思われるが、問題を検討して時、私はJSONライブラリではなく、そのような真理値の総額として、物事、ぶら下がりコンマおよび単一引用符についてうるさいことができることを見てきました二重引用符よりも。

Python 2.7はjsonのRFC 7159 and ECMA 404仕様を使用しているようですので、無料のjson validatorを使用してjsonがひどく形成されているかどうかを確認しました。それはjsonのすべての標準に対して首尾よく検証されたので、pythonは入力にかなり満足しているはずです。

私は唯一の違いは、私はまた、アップロードしたthe fileスペースなしがあるということで、json on pastebinの1行を開催しました。

私は解決策をオンラインで探し、真理値を大文字にしたり、すべての一重引用符を置き換えたり、ASCIIからテキストを解読するなど、いくつかの方法を試しました。

for line in f.readline(): 

f.readline()戻り1つの文字列、ファイルの最初の行:

+0

'json.loads()'関数は、**任意の**有効な** JSON *を受け入れます。はい、有効なJSONではないため、 'True'は受け入れられません。Python *の構文です。しかし、それはあなたの問題ではありません。オンラインのJSONバリデーターは、それが有効なJSONであることを通知します。 –

答えて

3

あなたは最初の行の文字以上をループしています。

with open(file_name) as f: 
    for line in f: 
     if line.strip(): 
      save_game.append(json.loads(line)) 

私は(簡単に1を含むことができ、ファイルの終わり)空行をスキップするために余分なテストで追加しました:あなたがすべてでここreadline()を呼び出す必要はありません、単に直接ファイルオブジェクトを反復処理。

あなたもリスト内包に上記を変えることができます:あなたのJSON文書は自分で改行が含まれていない場合は、上記ののみを動作することを

def load_save_game(file_name): 
    with open(file_name) as f: 
     return [json.loads(l) for l in f if l.strip()] 

注意を。 がファイル内に1つのJSON文書を持っている場合はjson.load(f)(ルーピングなし)を使用するか、different techniqueを使用して複数のJSON文書を文書自体に改行で解析します。

>>> len(load_save_game(os.path.expanduser('~/Downloads/20_05_2016_16-04-31.txt'))) 
301 
+0

ありがとうございます。当然ながら、私は悪い反復をキャッチしていたはずですが、私はそれがなぜそんなに一般的な間違いであるのか正確にはわかりません。 – Aaron3468

1

マルタインが述べたように、あなたが直接開いているファイルを反復処理する必要があります。

上記line.strip()コールの有無にかかわらず、あなたの付属のサンプルファイルに正常に動作します。

私はこのようなコードを記述します。

save_game = map(json.loads, f) 

EDIT:

maplistを返すために、Python2のために働きます。 Python3で作業している場合は、maplistで囲む必要があります。

+0

'map'は本当に便利な関数です。挑戦的な部分は、問題を解決するための可視的なツールをすでに持っているときに、オプションとして考えることを学ぶことです。 – Aaron3468

関連する問題