ChatGPT解决这个技术问题 Extra ChatGPT

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

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


A
Andre

The json module 是一个很好的解决方案。与pickle相比,它的优点是只产生纯文本输出,并且是跨平台和跨版本的。

import json
json.dumps(dict)

我也会看看这个模块。 json 和 pickle 看起来都很容易使用,所以它会归结为诸如跨平台支持之类的东西。谢谢
在这一点上,Pickle 往往被视为相当过时。我总是将 json 用于这样的事情。在大多数情况下,(相对)人类可读是一件大事。
您应该添加一个简单的示例,让用户了解如何执行此操作。
@TylerEaves 你能举例说明应该怎么做。
:foreheadslap: 不要像我一样忘记import json
v
vinzee

如果您的字典不是太大,也许 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 或 pickle 可能有什么问题,但我知道 eval 在这种情况下会很危险。
@AJ00200:还有我提到的 ast.literal_eval 替代方案?来自 Python 帮助:“安全地评估表达式节点或包含 Python 表达式的字符串。提供的字符串或节点可能仅包含以下 Python 文字结构:字符串、数字、元组、列表、字典、布尔值和无。这可用于安全地评估来自不受信任来源的包含 Python 表达式的字符串,而无需自己解析值。”
看起来确实很有用,但是当我之前使用 SQLite 处理这些数据时,它有超过 1500 个条目,所以它非常大并且一直在增长。
str(dict) 可能有问题 - 我在 py2.7 中注意到它可以生成一个表示带有单引号的 dict 的字符串,在某些情况下可能会与 json 混淆,但单引号不在 json 规范中。我更喜欢@Eyal Ch 描述的方法
ast.literal_eval 选项确实要好得多,但可能并不比使用 json 库好。建议对可能不受信任的数据使用 eval 是一个巨大的安全问题。 eval 几乎从来都不是正确的答案,如果误用,可能会造成灾难性的后果,看起来这个答案的普通读者可能会这样做。
f
fedorqui

我使用 json

import json

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

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

F
FightWithCode

为什么不使用 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'}"

这是你喜欢的简单。


i
ismail

使用 pickle 模块将其保存到磁盘并稍后加载。


@extraneon 实际上,这是对问题的回答。它在某处将其转换为字符串并将其写入文件。我不必进行实际的转换或文件写入,因为它全部由 pickle 封装。
H
Hrvoje

将字典转换为 JSON(字符串)

import json 

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

result = json.dumps(mydict)

print(result[0:20])

会给你:

{“名称”:“唐”,“苏尔

将字符串转换为字典

back_to_mydict = json.loads(result) 

A
Andrey Rubshtein

在中文中,您应该进行以下调整:

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

如果您解释了您提供的代码如何回答问题,这将是一个更好的答案。
m
martineau

我认为您应该考虑使用提供持久文件支持的类字典对象的 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}

m
mathandy

您可能会发现 json.dumps() 方法需要帮助处理某些对象类型。

归功于以下 this post 的最佳答案:

import json
json.dumps(my_dictionary, indent=4, sort_keys=True, default=str)

T
Tomasz Bartkowiak

如果您关心速度,请使用 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]

G
Gerard

如果需要可读(恕我直言,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 标志。
我本来可以更明确的。但是 dumps() 默认为协议 0,它是一个 ascii 协议。这就是为什么 'rb' 不是必需的恕我直言。
A
Abdul Muiz Khan

我发现问题不在于我的 dict 对象,而是使用 RubyMarshl 'loads' 方法加载它后属于 RubyString 类型的键和值

所以我这样做了:

dic_items = dict.items()
new_dict = {str(key): str(value) for key, value in dic_items}