Pythonのjson.dump()とjson.dumps()の違いは何ですか?


131

私はで検索この json.dump()とPythonでjson.dumps()の違いを見つけるために、公式の文書。それらがファイル書き込みオプションに関連していることは明らかです。
しかし、それらの間の詳細な違いは何ですか、またどのような状況で他の人よりも利点があるのですか?

回答:


146

ドキュメントが言うこと以外に追加することはあまりありません。JSONをファイル/ソケットなどにダンプする場合は、を使用する必要がありdump()ます。(印刷、解析などのために)文字列としてのみ必要な場合は、dumps()(ダンプ文字列)を使用します

この回答Antii Haapalaが言及したように、ensure_ascii動作にはいくつかの小さな違いがあります。これは主にwrite()、文字列全体ではなくチャンクに対して機能するため、基になる関数がどのように機能するかによるものです。詳細については、彼の回答を確認してください。

json.dump()

objをJSON形式のストリームとしてfpにシリアル化します(.write()をサポートするファイルのようなオブジェクト)

Ensure_asciiがFalseの場合、fpに書き込まれる一部のチャンクはUnicodeインスタンスである可能性があります

json.dumps()

objをJSON形式のstrにシリアル化する

Ensure_asciiがFalseの場合、結果には非ASCII文字が含まれる可能性があり、戻り値はUnicodeインスタンスである可能性があります


dump()を使用してソケット経由で送信する方法の例を示すことができますか?dumps()とencode()よりもバイトに変換できることはわかっていますが、もっと短い方法はありますか?
ボーイ


20

メモリ使用量と速度。

これを呼び出すjsonstr = json.dumps(mydata)と、最初にメモリにデータの完全なコピーが作成され、次にfile.write(jsonstr)ディスクにコピーされます。したがって、これはより高速な方法ですが、保存するデータが大きい場合は問題になる可能性があります。

json.dump(mydata, file)「s」なしで呼び出すと、データはチャンクでダンプされるため、新しいメモリは使用されません。しかし、全体のプロセスは約2倍遅くなります。

出典:私はのソースコードを確認json.dump()し、json.dumps()との時間を計測する変異体の両方とも試験time.time()やホテルトップでのメモリ使用量を見ています。


6

Python 2の注目すべき違いの1つは、を使用している場合ensure_ascii=FalsedumpUTF-8でエンコードされたデータをファイルに適切に書き込むことです(UTF-8以外の拡張文字を含む8ビット文字列を使用した場合を除く)。

dumps一方、with ensure_ascii=Falseは、文字列に使用したタイプに応じて、strまたはを生成できunicodeます。

この変換テーブルを使用して、objをJSON形式のstrにシリアル化します。Ensure_asciiがFalseの場合、結果には非ASCII文字が含まれる可能性がunicodeあり、戻り値インスタンスになる可能性があります

(強調鉱山)。それもstrインスタンスである可能性があることに注意してください。

したがって、返される値を使用して、返された形式を確認し、場合によってはを使用することなく構造をファイルに保存することはできませんunicode.encode

もちろん、これはPython 3ではもはや有効ではありません。これは、この8ビット/ Unicodeの混乱がなくなるためです。


用としてloadloadsload考えて全体のあなたは、単一のファイルから複数の改行制限JSON文書を読むためにそれを使用することはできませんので、1つのJSONドキュメントするファイルを。


Python文字列オブジェクトで作成されたすべてのテキストはUnicodeですが、それを総称的に想定しても安全ですか?すなわち、ファイルからコンテンツをロードするとき?
ジョアン・ゴンサルベス

@JoãoGonçalvesこれは、Pythonがサイレントで承認するように、バイナリデータとテキストを混在させることができないことを意味します。例json.dumps([b'123'])-> TypeError
Antti Haapala 2016年

@JoãoGonçalvesは、JSONドキュメントの文字列はUnicodeである必要があり、RFC 7159に従ってUTF-8、UTF-16、またはUTF-32のいずれかである必要があることにも注意してください
Antti Haapala

1
説明ありがとうございます!理にかなっている
ジョアンゴンサルベス2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.