簡體   English   中英

將python dict轉換為字符串並返回

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM