考虑到以下因素,我们何时应该优先使用YAML而不是JSON,反之亦然?
我计划在嵌入式系统中使用这两个中的一个来存储配置文件.
我知道Python pickling是一种以对象编程方式"存储"Python对象的方式 - 与用txt文件或DB编写的输出不同.
关于以下几点,您有更多细节或参考资料:
换句话说,我正在寻找一个关于酸洗的文档 - Python.doc解释了如何实现pickle但似乎没有深入了解有关序列化的使用和必要性的细节.
有没有办法在Python中序列化使用元组作为键的字典:
a={(1,2):'a'}
Run Code Online (Sandbox Code Playgroud)
简单地使用json.dumps(a),产生:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/json/__init__.py", line 230, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python2.6/json/encoder.py", line 367, in encode
chunks = list(self.iterencode(o))
File "/usr/lib/python2.6/json/encoder.py", line 309, in _iterencode
for chunk in self._iterencode_dict(o, markers):
File "/usr/lib/python2.6/json/encoder.py", line 268, in _iterencode_dict
raise TypeError("key {0!r} is not a string".format(key))
TypeError: key (1, 2) is not a string
Run Code Online (Sandbox Code Playgroud) hmset函数可以设置每个字段的值,但我发现如果值本身是一个复杂的结构化对象,则从hget返回的值是序列化字符串,而不是原始对象
例如
images= [{'type':'big', 'url':'....'},
{'type':'big', 'url':'....'},
{'type':'big', 'url':'....'}]
redis = Redis()
redis.hset('photo:1', 'images', images)
i = redis.hget('photo:1', 'images')
print type(i)
Run Code Online (Sandbox Code Playgroud)
i的类型是一个字符串,而不是一个python对象,除了手动解析每个字段之外,还有什么方法可以解决这个问题吗?
我已经在python中创建了一个字典并将其转换为pickle.它的大小达到了300MB.现在,我想加载相同的泡菜.
output = open('myfile.pkl', 'rb')
mydict = pickle.load(output)
Run Code Online (Sandbox Code Playgroud)
加载这个泡菜大约需要15秒.我怎样才能减少这个时间?
硬件规格:Ubuntu 14.04,4GB RAM
下面的代码显示了使用json,pickle,cPickle转储或加载文件所需的时间.
转储后,文件大小约为300MB.
import json, pickle, cPickle
import os, timeit
import json
mydict= {all values to be added}
def dump_json():
output = open('myfile1.json', 'wb')
json.dump(mydict, output)
output.close()
def dump_pickle():
output = open('myfile2.pkl', 'wb')
pickle.dump(mydict, output,protocol=cPickle.HIGHEST_PROTOCOL)
output.close()
def dump_cpickle():
output = open('myfile3.pkl', 'wb')
cPickle.dump(mydict, output,protocol=cPickle.HIGHEST_PROTOCOL)
output.close()
def load_json():
output = open('myfile1.json', 'rb')
mydict = json.load(output)
output.close()
def load_pickle():
output = open('myfile2.pkl', 'rb')
mydict = pickle.load(output)
output.close()
def …Run Code Online (Sandbox Code Playgroud) 什么是更快:
(A)'Unpickling'(正在加载)一个酸洗字典对象,使用 pickle.load()
要么
(B)使用将JSON文件加载到字典 simplejson.load()
假设:在案例A中已存在pickle对象文件,并且在案例B中已存在JSON文件.
我试图以一种可以在外部表单中读取它们的方式序列化我的对象,并找到了 jsonpickle。但事实证明它将我的字典键从整数转换为字符串。
我注意到这个线程只使用 JSON 包来解决这个问题,但我希望 jsonpickle 能够解决这个问题。有任何已知的解决方法吗?或者是否有更好的文本模式序列化格式可用于 Python?
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
>>> a={}
>>> a[11]="eleventy"
>>> a[22]="twice that"
>>> a
{11: 'eleventy', 22: 'twice that'}
>>> import jsonpickle
>>> jstring=jsonpickle.encode(a)
>>> jstring
'{"22": "twice that", "11": "eleventy"}'
>>> b=jsonpickle.decode(jstring)
>>> b
{'22': 'twice that', '11': 'eleventy'}
>>>
Run Code Online (Sandbox Code Playgroud)
更新:短期内我的工作是拥有并行保存功能——一个用于 pickle,一个用于 jsonpickle。由于我的对象很复杂(循环引用),我无法摆脱无法处理的对象。我最初的要求是拥有一种可以在文本编辑器中读取的格式,这样我就可以检测逻辑问题,只要常规 pickel 是可靠的(它是),那么现在就可以了。有一天我可能想让其他一些非 Python 软件吃掉这个文件,所以我想找到一个可用的解决方案。XML 格式?Python 社区似乎对序列化为 XML 不太感兴趣。至少我还没有找到一个像 pickle/jsonpickle 一样容易工作的包。
我有一个 Python 脚本,它返回一个 dict,我想将其存储在某个地方以在更大的项目中使用(该脚本运行速度很慢,所以我不想在每次需要字典时只导入脚本)。
字典很小,所以我看到两个选项。我可以:
将 dict 作为文字写入新的 .py 文件,如下所示:
my_dict = slow_func()
with open('stored_dict.py', 'w') as py_file:
file_contents = 'stored_dict = ' + str(my_dict)
py_file.write(my_dict)
Run Code Online (Sandbox Code Playgroud)
然后我可以使用访问字典文字 from stored_dict import stored_dict
我应该更喜欢这些选项之一吗?