Python dictを文字列に変換して戻す


275

辞書オブジェクトにデータを格納するプログラムを書いていますが、このデータはプログラム実行中のある時点で保存し、プログラムを再度実行したときに辞書オブジェクトに再度読み込む必要があります。辞書オブジェクトを文字列に変換して、ファイルに書き込み、辞書オブジェクトに再度読み込むにはどうすればよいですか?これは、うまくいけば、辞書を含む辞書をサポートするでしょう。

回答:


274

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

import json
json.dumps(dict)

2
このモジュールも見ていきます。jsonとpickleはどちらも簡単に使用できるように見えるため、クロスプラットフォームのサポートなどが必要になります。ありがとう
AJ00200

5
この時点で、ピクルスはむしろ非推奨と見なされる傾向があります。私はいつもこのようなことにjsonを使用しています。(比較的)人間が読めることは、BIGプラスである場合がほとんどです。
タイラーイーブス

30
簡単な例を追加して、ユーザーがその方法を確認できるようにする必要があります。
Miguel Vazq 2015

1
@TylerEavesそれがどのように行われるべきかの例を提供できますか?
Boban

1
:foreheadslap:import json私がしたようなことを忘れないでください!
ジェシーチザム

207

辞書が大きすぎない場合は、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を使用できます。


13
これがコードに導入される可能性のあるエクスプロイトに対処する準備は本当にできていません。jsonやpickleにどのような問題があるのか​​はわかりませんが、この場合evalは危険であることは知っています。
AJ00200

5
@ AJ00200:と私が述べたast.literal_evalの代替?Pythonヘルプから:「式ノードまたはPython式を含む文字列を安全に評価します。提供される文字列またはノードは、文字列、数値、タプル、リスト、dicts、ブール、およびNoneのみで構成できます。これは、自分で値を解析する必要なしに、信頼できないソースからのPython式を含む文字列を安全に評価するために使用できます。」
PabloG 2010

は便利なようですが、以前にSQLiteを使用してこのデータを処理していて、1500を超えるエントリがあったため、非常に大きく、常に増加しています。
AJ00200

164

私が使う json

import json

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

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

14

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


2
@extraneon実際、それは質問に対する答えです。それをどこかに文字列に変換し、ファイルに書き込みます。すべてpickleでカプセル化されているため、実際の変換やファイルの書き込みを行う必要はありません。
AJ00200 2010

11

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

Chinsesの場合

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')

1
あなたが提供したコードが質問にどのように答えるかをあなたが説明したならば、これはより良い答えでしょう。
pppery

4

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

import json 

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

result = json.dumps(mydict)

print(result[0:20])

あなたを得るでしょう:

{「名前」:「ドン」、「シュール

文字列を辞書に変換

back_to_mydict = json.loads(result) 

3

私はあなたが使用を検討する必要があると思います shelve永続的なファイル支援の辞書のようなオブジェクトを提供モジュールの。「実際の」ディクショナリの代わりに使用するのは簡単です。これは、プログラムをディクショナリのように使用できるものをほぼ透過的に提供します。明示的に文字列に変換してからファイルに書き込む必要はありません(またはその逆)逆)。

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

これは簡単な例です:

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}

2

速度を気にする場合は、jsonと同じAPIを持つujson(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でもない場合)にyamlを使用するか、読み取りが不要な場合は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

bここでファイルを開くときは、フラグを使用する必要があります。
ピオトルドブロゴスト

1
私はもっ​​と明示的だったかもしれない。ただし、dumps()デフォルトはプロトコル0で、これはASCIIプロトコルです。だからこそ'rb'私見は必要ありません。
ジェラール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.