[英]Convert a python dict to a string and back
我正在編寫一個將數據存儲在字典對象中的程序,但是這些數據需要在程序執行期間的某個時間點保存,並在程序再次運行時加載回字典對象。 如何將字典對象轉換為可以寫入文件並加載回字典對象的字符串? 這將有望支持包含字典的字典。
json 模塊在這里是一個很好的解決方案。 與pickle相比,它的優點是只產生純文本輸出,並且是跨平台和跨版本的。
import json
json.dumps(dict)
如果您的字典不是太大,也許 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)
如果源不受信任,您可以使用ast.literal_eval代替 eval 以獲得額外的安全性。
我使用json
:
import json
# convert to string
input = json.dumps({'id': id })
# load to dict
my_dict = json.loads(input)
為什么不使用 Python 3 的內置ast庫的函數literal_eval 。 最好使用literal_eval而不是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'}"
這是你喜歡的簡單。
使用pickle
模塊將其保存到磁盤並稍后加載。
將字典轉換為 JSON(字符串)
import json
mydict = { "name" : "Don",
"surname" : "Mandol",
"age" : 43}
result = json.dumps(mydict)
print(result[0:20])
會給你:
{“名稱”:“唐”,“蘇爾
將字符串轉換為字典
back_to_mydict = json.loads(result)
在中文中,您應該進行以下調整:
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')
我認為您應該考慮使用提供持久文件支持的類字典對象的shelve
模塊。 它很容易代替“真正的”字典,因為它幾乎透明地為您的程序提供了可以像字典一樣使用的東西,而無需將其顯式轉換為字符串然后寫入文件(或副 -反之亦然)。
主要區別是需要在首次使用之前首先open()
它,然后在完成后close()
它(並且可能sync()
它,取決於正在使用的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}
您可能會發現json.dumps()
方法需要幫助處理某些對象類型。
歸功於以下內容的這篇文章的最佳答案:
import json
json.dumps(my_dictionary, indent=4, sort_keys=True, default=str)
如果您關心速度,請使用ujson (UltraJSON),它具有與 json 相同的 API:
import ujson
ujson.dumps([{"key": "value"}, 81, True])
# '[{"key":"value"},81,true]'
ujson.loads("""[{"key": "value"}, 81, true]""")
# [{u'key': u'value'}, 81, True]
如果需要可讀(恕我直言,JSON 和 XML 都不是),或者如果不需要讀取,我使用 yaml。
寫
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
我發現問題不在於我的 dict 對象,而是使用 RubyMarshl 'loads' 方法加載它后屬於 RubyString 類型的鍵和值
所以我這樣做了:
dic_items = dict.items()
new_dict = {str(key): str(value) for key, value in dic_items}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.