Pythonで文字列を辞書(dict)に変換する方法|ast.literal_evalとjson.loadsの使い分け
Pythonでは、文字列形式で表現された辞書データを実際のdictオブジェクトに変換したい場面がよくあります。主な方法としては、標準ライブラリの ast.literal_eval() を使う方法と、json モジュールを使う方法の2つがあります。それぞれの特徴と使い方を詳しく見ていきましょう。
方法1:ast.literal_eval() を使う
ast.literal_eval() は、文字列をPythonの式として安全に評価する関数です。任意のコードを実行できてしまう eval() とは異なり、リテラル構造以外は評価しないため、セキュリティ面でも安心して利用できます。
評価できるのは、文字列・数値・タプル・リスト・辞書・ブーリアン・NoneといったPythonのリテラル構造のみに限られます。
>>> import ast
>>> x = ast.literal_eval("{'foo': 'bar', 'hello': 'world'}")
>>> print(x)
{'foo': 'bar', 'hello': 'world'}
>>> type(x)
<class 'dict'>
このように、Pythonの辞書リテラルと同じ書式(シングルクォートを含む)の文字列を、そのままdictオブジェクトへ変換できます。
方法2:json.loads() を使う
辞書はJSON文字列としても捉えることができるため、json モジュールの loads() 関数を使って変換することも可能です。
>>> import json
>>> x = json.loads('{"foo": "bar", "hello": "world"}')
>>> print(x)
{'foo': 'bar', 'hello': 'world'}
>>> type(x)
<class 'dict'>
ただし重要な注意点があります。json.loads() は厳密なJSON形式を要求します。JSONでは、キーと文字列型の値を必ずダブルクォート(")で囲む必要があるため、シングルクォートで書かれた文字列を渡すとエラーになります。Pythonの辞書形式のまま変換したい場合は、前述の ast.literal_eval() を使用しましょう。
使い分けのポイント
- ast.literal_eval():Pythonの辞書リテラル形式(シングルクォートOK)の文字列を、信頼できるソースから安全に変換したい場合に最適
- json.loads():外部APIやファイルから取得した正規のJSON文字列を変換したい場合に最適
どちらの方法もPythonの標準ライブラリだけで実現でき、追加のパッケージインストールは不要です。入力データの形式や取得元に応じて、適切な方法を選択してください。
-
Pythonで文字列をバイナリ(2進数)に変換する方法をわかりやすく解説
Pythonで文字列をバイナリに変換する基本の考え方Pythonで文字列をバイナリ(2進数)表現に変換するには、文字列内の各文字を1つずつ取り出し、それぞれを2進数へ変換したうえで、結果をひとつの文字列として連結します。各文字の文字コードは ord() 関数で取得でき、format() 関数に「b」フォーマット指定子を渡すことで、簡単に2進数形式へ整形できます。format() と ord() を使った変換方法最もシンプルなのが、format(ord(x), b) を使って各文字 x を2進数の文字列に変換する方法です。次の例では、文字列 hello world の各文字をスペース区切りのバイ
-
【Python】辞書形式の文字列をdict型に変換する2つの安全な方法
はじめにPythonでは、文字列として表現された辞書(例:{foo: bar})を、実際の辞書(dict型)オブジェクトに変換したい場面がよくあります。この記事では、代表的な2つの変換方法である ast.literal_eval() と json.loads() の使い方を解説します。方法1: ast.literal_eval() を使うast.literal_eval() を使うと、文字列をPythonの式として安全に評価できます。この関数は、式ノードまたはPython式を含む文字列を評価しますが、許可されているのは文字列・数値・タプル・リスト・辞書・ブール値・Noneといったリテラル構造の