我在this官方文档中搜索了python中json.dump()和json.dumps()之间的区别。很明显,它们与文件写入选项有关。
但是他们之间的细微差别是什么?在什么情况下,他们比其他人更有优势呢?
答案 0 :(得分:87)
除了文档所说的内容之外,还没有其他任何内容可以添加。如果要将JSON转储到文件/套接字或其他任何内容中,那么您应该转到dump()
。如果你只需要它作为字符串(用于打印,解析或其他),那么使用dumps()
(转储字符串)
如Antii Haapala in this answer所述,ensure_ascii
行为存在一些细微差别。这主要是由于底层write()
函数如何工作,因为它运行成块而不是整个字符串。有关详细信息,请查看答案。
json.dump()
将obj序列化为JSON格式的流到fp(.write() - 支持类似文件的对象
如果ensure_ascii为False,写入fp的一些块可能是unicode实例
json.dumps()
将obj序列化为JSON格式的str
如果ensure_ascii为False,则结果可能包含非ASCII字符,返回值可能是unicode实例
答案 1 :(得分:23)
带s
的函数接受字符串参数。其他人拿文件
流。
答案 2 :(得分:5)
Python 2 的一个显着区别是,如果您使用ensure_ascii=False
,dump
会将UTF-8编码数据正确地写入文件中(除非您使用了非UTF-8扩展字符的8位字符串:
dumps
ensure_ascii=False
只能根据您用于字符串的类型生成str
或unicode
:
使用此转换表将obj序列化为JSON格式的str。如果ensure_ascii为False,则结果可能包含非ASCII字符,返回值可能是
unicode
实例。
(强调我的)。请注意,它可能仍然是str
实例。
因此,您无法使用其返回值将结构保存到文件中而不检查哪个
格式已返回,可能正在使用unicode.encode
。
这当然不再是Python 3中的有效问题,因为不再存在这种8位/ Unicode混淆。
对于load
vs loads
,load
认为整个文件是一个JSON文档,因此您无法使用它来读取多个新行有限的JSON来自单个文件的文件。
答案 3 :(得分:1)
内存使用率和速度。
调用jsonstr = json.dumps(mydata)
时,它首先在内存中创建数据的完整副本,然后才file.write(jsonstr)
将其复制到磁盘。因此,这是一种更快的方法,但是如果要保存大量数据,则可能会成为问题。
调用json.dump(mydata, file)
时-不带's'时,将不使用新的内存,因为数据是按块转储的。但是整个过程要慢大约2倍。
源:我检查了json.dump()
和json.dumps()
的源代码,还测试了使用time.time()
测量时间并观察htop中的内存使用情况的两种变体。