【发布时间】:2016-07-03 17:18:17
【问题描述】:
我在this官方文档中搜索了python中json.dump()和json.dumps()的区别。很明显,它们与文件写入选项有关。
但是它们之间的详细区别是什么?在什么情况下一个比另一个更有优势?
【问题讨论】:
标签: python json python-2.7
我在this官方文档中搜索了python中json.dump()和json.dumps()的区别。很明显,它们与文件写入选项有关。
但是它们之间的详细区别是什么?在什么情况下一个比另一个更有优势?
【问题讨论】:
标签: python json python-2.7
除了文档说的内容之外,没有其他要添加的内容。如果您想将 JSON 转储到文件/套接字或其他任何内容中,那么您应该使用 dump()。如果您只需要它作为字符串(用于打印、解析或其他),请使用dumps()(转储字符串)
正如Antti 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 实例
【讨论】:
dump(或with open和dump)是异步的,还是dump(或with open和dump)会在继续执行脚本之前完全完成执行?
带有s 的函数采用字符串参数。其他人拿文件
流。
【讨论】:
在内存使用和速度方面。
当您调用jsonstr = json.dumps(mydata) 时,它首先在内存中创建数据的完整副本,然后您才将file.write(jsonstr) 复制到磁盘。因此,这是一种更快的方法,但如果您要保存大量数据,则可能会出现问题。
当你调用json.dump(mydata, file) -- 没有's'时,新的内存不会被使用,因为数据是由块转储的。但整个过程大约慢了 2 倍。
来源:我检查了json.dump() 和json.dumps() 的源代码,还测试了两个变体,用time.time() 测量时间并观察htop 中的内存使用情况。
【讨论】:
Python 2 的一个显着区别是,如果您使用 ensure_ascii=False,dump 将正确地将 UTF-8 编码数据写入文件(除非您使用 8 位字符串非 UTF-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 文档。
【讨论】:
json.dumps([b'123']) -> TypeError.
dump(或with open和dump)是异步的,还是dump(或with open和dump)会在继续执行脚本之前完全完成执行?