Pythonを使用してJSONデータをファイルにプリティプリントする


111

クラスのプロジェクトには、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のドキュメントなどを指摘してくれた人に感謝しますが、すでに述べたように、私はすでにそれを調べており、支援が必要です。本当に役立つ回答は、そこにある例よりも詳細で説明的です。ありがとう

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

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

この結果:

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

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


1
バイナリデータ( "wb")を実際に書き込みたいのではないかと思う
Hamish

これはWindowsマシンに必要であると教えられ、これまでのところすべての割り当てで機能しています。なぜこれが正しくないのかについてのドキュメントを提供できるなら、私はそれを喜んで見ていきます。
ゼルビアン

バイナリファイルで作業している場合や、特定の形式の行末(例:\r\nvs \n)が重要な場合にのみ必要です。stackoverflow.com/questions/3257869/…を参照してください。あなたのケースでは、Windowsに適した行末が必要ですが、Twitterエンドポイントから取得できない可能性があるため、テキストモードで開く必要があります。
ハミッシュ2012

回答:


102

オプションの引数を使用する必要がありますindent

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()

1
働いていたこと、ありがとうござい完璧。「sort_keys」がそこにある必要がある理由を説明できますか?
ゼルビアン

1
そこにある必要はありませんが、非常にきれいでアルファベット順にソートされています。私は人間が読める出力が欲しいときにそれを使いがちです。
mattbornski、2012

4
よく説明していただきありがとうございます。ただし、&$&#にしようとしないでファイルを書き込むために開く/閉じることはお勧めしません。with構造が一般的に推奨with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var) されます:大きなスニペットなど、ファイルを確実に閉じる利点...
logicOnAbstractions

with構文は間違いなく
優れ

73

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

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

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


@Zelbinian:はい、それはここにwell.Takeとしてのsimplejsonのために見て作品simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/...
RanRag

これにより、ファイルが空になります。header, output = client.request(twitterRequest, method="GET", body=None, headers=None, force_auth_header=True) twitterDataFile = open("twitterData.json", "wb") json.dumps(json.loads(output), twitterDataFile, indent=4) twitterDataFile.close()
ゼルビアン、

5
@Zelbinian- json.dumps文字列を返します。json.dumpファイルに書き込みます。
dkamins

64
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()。単にを使用するだけです。それも速いです。


14

Pythonのjsonモジュールを使ってきれいに印刷できます。

>>> 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)

そのルートを試してみましたが、残念ながら思ったほどうまくいきません。
ゼルビアン、2012

@Zelbinian:正確にはどういう意味doesn't work as wellですか?
RanRag

1
きれいに出力されたJson構文ではなく、Python dict構文のように見えるもののデータを1行で出力しました
Zelbinian

質問に出力を編集として含めます。したがって、それを見ることができます。
RanRag 2012

これを使用すると、配列は各値の行数としてリストされます。配列を1行に保つとよいでしょう。
スケープ

4

あなたがすでにきれいにフォーマットしたい既存のJSONファイルを持っているなら、これを使うことができます:

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

3

新しい* .jsonを生成する場合、または既存のjosnファイルを変更する場合は、pretty view json形式に「indent」パラメーターを使用します。

import json
responseData = json.loads(output)
with open('twitterData.json','w') as twitterDataFile:    
    json.dump(responseData, twitterDataFile, indent=4)

1
import json
def writeToFile(logData, fileName, openOption="w"):
  file = open(fileName, openOption)
  file.write(json.dumps(json.loads(logData), indent=4)) 
  file.close()  

このコードは質問に答えることがありますが、このコードが質問に答える理由方法に関する追加のコンテキストを提供すると、長期的な価値が向上します。
TAN

-2

ファイルをpythonにリダイレクトして、ツールを使用して開き、それを使用して読み込むことができます。

サンプルコードは、

cat filename.json | python -m json.tool | more
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.