将python字典转换为字符串并返回


275

我正在编写一个将数据存储在字典对象中的程序,但是该数据需要在程序执行过程中的某个时候保存,并在再次运行该程序时重新加载到字典对象中。如何将字典对象转换为可以写入文件并可以加载回字典对象的字符串?希望这将支持包含词典的词典。

Answers:


274

json模块是一个很好的解决方案。与pickle相比,它的优势在于它仅生成纯文本输出,并且是跨平台和跨版本的。

import json
json.dumps(dict)

2
我还将研究这个模块。json和pickle似乎都足够易于使用,因此归结为跨平台支持之类的东西。谢谢
AJ00200

5
在这一点上,Pickle通常被认为已过时了。我总是使用json这样的东西。(相对)人类可读是一大笔额外的时间。
泰勒屋檐

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

如果源不受信任,则可以使用ast.literal_eval而不是eval来提高安全性。


13
我真的没有准备好应对可能引入代码中的漏洞。我不知道json或pickle可能有什么问题,但我知道在这种情况下eval会很危险。
AJ00200 '12

5
@ AJ00200:和我提到的ast.literal_eval替代?从Python帮助中:“安全地评估表达式节点或包含Python表达式的字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串,数字,元组,列表,字典,布尔值和无。可以用于安全地评估包含来自不受信任来源的Python表达式的字符串,而无需自行解析值。”
PabloG 2010年

这样做确实有用,但是当我以前使用SQLite处理该数据并且它有1500多个条目时,它很大并且一直在增长。
AJ00200 2010年

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。最好使用literal_eval而不是eval

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

将输出作为实际字典

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

而且,如果您要求将Dictionary转换为String,那么如何使用str() Python的方法。

假设字典是:

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

这将像这样完成:

str(my_dict)

将打印:

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

这是您想要的简单操作。


5

如果在中国

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

将为您提供:

{“ name”:“ Don”,“ sur

将字符串转换成字典

back_to_mydict = json.loads(result) 

3

我认为您应该考虑使用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}


1

如果需要可读性(不是IMHO的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

b在此处打开文件时,您确实应该使用标志。
Piotr Dobrogost

1
我本来可以更明确。但是dumps()默认值为协议0,这是一个ascii协议。这就是为什么'rb'不需要恕我直言。
杰拉德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.