web-dev-qa-db-ja.com

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

Pythonでjson.dump()とjson.dumps()の違いを見つけるために this 公式ドキュメントを検索しました。それらがファイル書き込みオプションに関連していることは明らかです。
[。

85
Kumaran

ドキュメントが言うこと以外に追加することはほとんどありません。 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インスタンスになる場合があります

93

sを持つ関数は文字列パラメーターを取ります。その他はファイルストリームを取得します。

23

Python 2の顕著な違いの1つは、ensure_ascii=Falseを使用している場合、dumpがUTF-8エンコードデータをファイルに適切に書き込むことです(UTF- 8):

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

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

(エンファシス鉱山)。まだstrインスタンスでもあることに注意してください。

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

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


loadloadsに関しては、loadwholeファイルを1つのJSONドキュメントと見なします。そのため、単一のファイルから複数の改行制限JSONドキュメントを読み取ることはできません。

5
Antti Haapala

メモリ使用量と速度。

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

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

ソース:json.dump()およびjson.dumps()のソースコードをチェックし、time.time()で時間を測定し、htopでメモリ使用量を監視する両方のバリアントもテストしました。

1
JenyaKh