python中json.dump()和json.dumps()有什么区别?

时间:2016-03-17 11:27:17

标签: python json python-2.7

我在this官方文档中搜索了python中json.dump()和json.dumps()之间的区别。很明显,它们与文件写入选项有关。
但是他们之间的细微差别是什么?在什么情况下,他们比其他人更有优势呢?

4 个答案:

答案 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=Falsedump会将UTF-8编码数据正确地写入文件中(除非您使用了非UTF-8扩展字符的8位字符串:

另一方面,{p> dumps ensure_ascii=False只能根据您用于字符串的类型生成strunicode

  

使用此转换表将obj序列化为JSON格式的str。如果ensure_ascii为False,则结果可能包含非ASCII字符,返回值可能是unicode实例

(强调我的)。请注意,它可能仍然是str实例。

因此,您无法使用其返回值将结构保存到文件中而不检查哪个 格式已返回,可能正在使用unicode.encode

这当然不再是Python 3中的有效问题,因为不再存在这种8位/ Unicode混淆。

对于load vs loadsload认为整个文件是一个JSON文档,因此您无法使用它来读取多个新行有限的JSON来自单个文件的文件。

答案 3 :(得分:1)

内存使用率和速度。

调用jsonstr = json.dumps(mydata)时,它首先在内存中创建数据的完整副本,然后才file.write(jsonstr)将其复制到磁盘。因此,这是一种更快的方法,但是如果要保存大量数据,则可能会成为问题。

调用json.dump(mydata, file)时-不带's'时,将不使用新的内存,因为数据是按块转储的。但是整个过程要慢大约2倍。

源:我检查了json.dump()json.dumps()的源代码,还测试了使用time.time()测量时间并观察htop中的内存使用情况的两种变体。