【问题标题】: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()的区别。很明显,它们与文件写入选项有关。
但是它们之间的详细区别是什么?在什么情况下一个比另一个更有优势?

【问题讨论】:

    标签: python json python-2.7


    【解决方案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 opendump)是异步的,还是dump(或with opendump)会在继续执行脚本之前完全完成执行?
    【解决方案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=Falsedump 将正确地将 UTF-8 编码数据写入文件(除非您使用 8 位字符串非 UTF-8 的扩展字符):

        另一方面,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 文档。

        【讨论】:

        • 在 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 opendump)是异步的,还是dump(或with opendump)会在继续执行脚本之前完全完成执行?
        猜你喜欢
        • 2015-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-04
        • 2022-01-21
        • 2018-05-18
        • 2018-06-06
        • 2011-05-04
        相关资源
        最近更新 更多