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