python中的json.dump()和json.dumps()有啥区别?
Posted
技术标签:
【中文标题】python中的json.dump()和json.dumps()有啥区别?【英文标题】:What is the difference between json.dump() and json.dumps() in python?python中的json.dump()和json.dumps()有什么区别? 【发布时间】:2016-07-03 17:18:17 【问题描述】:我在this官方文档中搜索了python中json.dump()和json.dumps()的区别。很明显,它们与文件写入选项有关。 但是它们之间的详细区别是什么?在什么情况下一个比另一个更有优势?
【问题讨论】:
【参考方案1】:除了文档说的内容之外,没有其他要添加的内容。如果您想将 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() 通过套接字发送吗?我知道我可以使用 dumps() 而不是 encode() 来转换为字节,但是有没有更短的方法? 是dump
(或with open
和dump
)是异步的,还是dump
(或with open
和dump
)会在继续执行脚本之前完全完成执行?
【参考方案2】:
带有s
的函数采用字符串参数。其他人拿文件
流。
【讨论】:
【参考方案3】:在内存使用和速度方面。
当您调用jsonstr = json.dumps(mydata)
时,它首先在内存中创建数据的完整副本,然后您才将file.write(jsonstr)
复制到磁盘。因此,这是一种更快的方法,但如果您要保存大量数据,则可能会出现问题。
当你调用json.dump(mydata, file)
-- 没有's'时,新的内存不会被使用,因为数据是由块转储的。但整个过程大约慢了 2 倍。
来源:我检查了json.dump()
和json.dumps()
的源代码,还测试了两个变体,用time.time()
测量时间并观察htop 中的内存使用情况。
【讨论】:
【参考方案4】: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 文档。
【讨论】:
在 python 字符串对象中创建的所有文本都是 unicode,但一般假设它是否安全?即从文件加载内容时? @JoãoGonçalves 这意味着您不能将二进制数据与文本混合,以便 python 默默地批准它。例如json.dumps([b'123'])
-> TypeError
.
@JoãoGonçalves 还注意到 JSON 文档中的字符串必须是 Unicode,并且 必须是 UTF-8、UTF-16 中的任何一个或根据 RFC 7159 的 UTF-32
感谢您的解释!有道理
是dump
(或with open
和dump
)是异步的,还是dump
(或with open
和dump
)会在继续执行脚本之前完全完成执行?
以上是关于python中的json.dump()和json.dumps()有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
python中json.dump() 和 json.dumps() 有那些区别?
Python JSON dump ,load,dumps,loads
python中json文件处理涉及的四个函数json.dumps()和json.loads()json.dump()和json.load()的区分
python中json.dumps()和json.dump() 以及 json.loads()和json.load()的区分