web-dev-qa-db-ja.com

json.load()とjson.loads()関数の違いは何ですか

Pythonでは、json.load()json.loads()の違いは何ですか?

私はload()関数はファイルオブジェクトと一緒に使わなければならないと思います(したがってコンテキストマネージャを使う必要があります)がloads()関数はファイルへのパスを文字列として取ります。少し混乱します。

json.loads()の文字 " s "は string を表しますか?

ご回答ありがとうございます。

102
MMF

はい、sは文字列を表します。 json.loads関数はファイルパスを取りませんが、ファイルの内容を文字列として取ります。 https://docs.python.org/2/library/json.html ]でドキュメントを見てください。

97
Gijs

ドキュメントは非常に明確です: https://docs.python.org/2/library/json.html

json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

この変換テーブルを使用してfp(a .read() - JSONドキュメントを含むファイルのようなサポートオブジェクト)をPythonオブジェクトに逆シリアル化します。

json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

この変換テーブルを使用してs(JSONドキュメントを含むstrまたはUnicodeのインスタンス)をPythonオブジェクトに逆シリアル化します。

したがって、loadはファイル用、loadsstring用です。

25
RvdK

誰もが説明したことに簡単な例を追加するだけです。

json.load()

json.loadはファイル自体をデシリアライズすることができます、すなわちそれはfileオブジェクトを受け取ります、

with open("json_data.json", "r") as content:
  print(json.load(content))

出力します

{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}

なぜならcontentfile型、つまり<type 'file'>型だからです。

代わりにjson.loadsを使うと

with open("json_data.json", "r") as content:
  print(json.loads(content))

私はこのエラーが出ます:

TypeError:予想される文字列またはバッファ

json.loads()

json.loads()は文字列を非選択化します。

content.read()json.loads()とともに使用すると、ファイルの内容が返されます。

with open("json_data.json", "r") as content:
  print(json.loads(content.read()))

出力、

{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}

これは、content.read()の型が文字列、つまり<type 'str'>であるためです。

json.load()content.read()を一緒に使うとエラーになります、

with open("json_data.json", "r") as content:
  print(json.load(content.read()))

与える、

AttributeError: 'str'オブジェクトには属性 'read'がありません

これで、json.loadがファイルをデシリアライズし、json.loadsが文字列をデシリアライズできるようになりました。

別の例、

sys.stdinfileオブジェクトを返すので、print(json.load(sys.stdin))を実行すれば、実際のjsonデータが得られます。

cat json_data.json | ./test.py

{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}

json.loads()を使いたいのであれば、代わりにprint(json.loads(sys.stdin.read()))を使います。

14
Sufiyan Ghori