web-dev-qa-db-ja.com

Pythonを使用してJSONデータをファイルにきれいに出力する

クラスのプロジェクトには、Twitter JSONデータの解析が含まれます。データを取得してファイルに設定するのに苦労することはありませんが、それはすべて1行です。これは、私がやろうとしているデータ操作にとっては問題ありませんが、ファイルは非常に読みづらく、データを詳しく調べることができず、データ操作部分のコード記述が非常に難しくなります。

Python(つまり、コマンドラインツールを使用していないため、動作しません)内からそれを行う方法を知っていますか?これまでのコードは次のとおりです。

header, output = client.request(twitterRequest, method="GET", body=None,
                            headers=None, force_auth_header=True)

# now write output to a file
twitterDataFile = open("twitterData.json", "wb")
# magic happens here to make it pretty-printed
twitterDataFile.write(output)
twitterDataFile.close()

simplejsonのドキュメントなどを教えてくれている人に感謝しますが、既に述べたように、私はすでにそれを見ており、支援が必要です。本当に役立つ返信は、そこにある例よりも詳細で説明的です。 ありがとう

Also: Windowsコマンドラインでこれを試してください:

more twitterData.json | python -mjson.tool > twitterData-pretty.json

この結果:

Invalid control character at: line 1 column 65535 (char 65535)

私が使用しているデータを提供しますが、それは非常に大きく、ファイルを作成するために使用したコードは既に見たことがあります。

78
Zelbinian
header, output = client.request(twitterRequest, method="GET", body=None,
                            headers=None, force_auth_header=True)

# now write output to a file
twitterDataFile = open("twitterData.json", "w")
# magic happens here to make it pretty-printed
twitterDataFile.write(simplejson.dumps(simplejson.loads(output), indent=4, sort_keys=True))
twitterDataFile.close()
66
mattbornski

JSONを解析し、次のようなインデントを使用して再度出力できます。

import json
mydata = json.loads(output)
print json.dumps(mydata, indent=4)

詳細については、 http://docs.python.org/library/json.html を参照してください。

55
dkamins
_import json

with open("twitterdata.json", "w") as Twitter_data_file:
    json.dump(output, Twitter_data_file, indent=4, sort_keys=True)
_

後で文字列を解析したくない場合はjson.dumps()は不要で、単にjson.dump()を使用するだけです。それも速いです。

41
Andras Dosztal

json module of pythonを使用してきれいに印刷できます。

>>> import json
>>> print json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
{
    "4": 5,
    "6": 7
}

だから、あなたの場合

>>> print json.dumps(json_output, indent=4)
14
RanRag

きれいにフォーマットしたい既存のJSONファイルが既にある場合は、これを使用できます。

    with open('twitterdata.json', 'r+') as f:
        data = json.load(f)
        f.seek(0)
        json.dump(data, f, indent=4)
        f.truncate()
3
locke14