web-dev-qa-db-ja.com

Pythonの辞書を文字列に変換して元に戻す

データを辞書オブジェクトに格納するプログラムを書いていますが、プログラムの実行中のある時点でこのデータを保存し、プログラムを再実行したときに辞書オブジェクトにロードする必要があります。辞書オブジェクトをファイルに書き出して辞書オブジェクトにロードできる文字列に変換する方法を教えてください。これは辞書を含む辞書をサポートすることを願っています。

214
AJ00200

jsonモジュール はここでは良い解決策です。それはプレーンテキスト出力のみを生成し、クロスプラットフォームおよびクロスバージョンであるという点でpickleよりも優れています。

json.dumps(dict)
182
Tyler Eaves

あなたの辞書がそれほど大きくないならば、おそらくstr + evalがその仕事をすることができます:

dict1 = {'one':1, 'two':2, 'three': {'three.1': 3.1, 'three.2': 3.2 }}
str1 = str(dict1)

dict2 = eval(str1)

print dict1==dict2

ソースが信頼できない場合は、セキュリティを強化するためにevalの代わりに ast.literal_eval を使用できます。

184
PabloG

json を使用します。

import json

# convert to string
input = json.dumps({'id': id })

# load to dict
my_dict = json.loads(input) 
148
Eyal Ch

pickle モジュールを使ってディスクに保存し、後でロードします。

14
ismail

中国語の場合

import codecs
fout = codecs.open("xxx.json", "w", "utf-8")
dict_to_json = json.dumps({'text':"中文"},ensure_ascii=False,indent=2)
fout.write(dict_to_json + '\n')
5
beta

Python 3の組み込みastライブラリの関数literal_evalを使用しないのはなぜですか。 evalの代わりにliteral_evalを使用することをお勧めします。

import ast
str_of_dict = "{'key1': 'key1value', 'key2': 'key2value'}"
ast.literal_eval(str_of_dict)

実際の辞書として出力します

{'key1': 'key1value', 'key2': 'key2value'}

そして、辞書を文字列に変換したい場合は、Pythonのstr()メソッドを使用してください。

辞書が次のようになっているとします。

my_dict = {'key1': 'key1value', 'key2': 'key2value'}

そしてこれは次のように行われます。

str(my_dict)

印刷します:

"{'key1': 'key1value', 'key2': 'key2value'}"

これは簡単です。

5
FightWithCode

私はあなたが永続的なファイルに裏付けされた辞書のようなオブジェクトを提供する shelve モジュールを使うことを考慮すべきだと思います。 「本物の」辞書の代わりに使用するのは簡単です。文字列に明示的に変換してファイルに書き込む必要なしに、辞書のように使用できるものをプログラムにほぼ透過的に提供するからです。その逆).

主な違いは、最初に使用する前にそれをopen()し、それが終わったらそれをclose()することです(そして使用されるwritebackオプションによってはおそらくそれをsync()ingすること)作成する「シェルフ」ファイルオブジェクトには、通常の辞書を値として含めることができ、それらを論理的にネストすることができます。

これは簡単な例です。

import shelve

shelf = shelve.open('mydata')  # open for reading and writing, creating if nec
shelf.update({'one':1, 'two':2, 'three': {'three.1': 3.1, 'three.2': 3.2 }})
shelf.close()

shelf = shelve.open('mydata')
print shelf
shelf.close()

出力:

{'three': {'three.1': 3.1, 'three.2': 3.2}, 'two': 2, 'one': 1}
3
martineau

速度を重視する場合は、jsonと同じAPIを持つ json (UltraJSON)を使用します。

import ujson
ujson.dumps([{"key": "value"}, 81, True])
# '[{"key":"value"},81,true]'
ujson.loads("""[{"key": "value"}, 81, true]""")
# [{u'key': u'value'}, 81, True]
1

読みやすくする必要がある場合(JSONでもXMLでもない)、または読みが必要ない場合はpickleを使用します。

書きます

from pickle import dumps, loads
x = dict(a=1, b=2)
y = dict(c = x, z=3)
res = dumps(y)
open('/var/tmp/dump.txt', 'w').write(res)

読み返す

from pickle import dumps, loads
rev = loads(open('/var/tmp/dump.txt').read())
print rev
1
Gerard

辞書をJSON(文字列)に変換

import json 

mydict = { "name" : "Don", 
          "surname" : "Mandol", 
          "age" : 43} 

result = json.dumps(mydict)

print(result[0:20])

あなたを取得します:

{「名前」:「Don」、「sur

文字列を辞書に変換する

back_to_mydict = json.loads(result) 
1
Harvey