python中dump 和dumps load和loads的区别

关于这两者的区别自己一开始记得住但是过了一段时间就容易忘记,所以写一篇博客来记录一下。此文章为转载的文章,因为写的比较细,所以特此写一篇博客:

地址:https://blog.csdn.net/mr_evanchen/article/details/77879967

1、json.dumps()

         json.dumps()用于将dict类型的数据转成str,因为如果直接将dict类型的数据写入json文件中会发生报错,因此在将数据写入时需要用到该函数。

[python] view plain copy

  1. import json  
  2.    
  3. name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}   
  4.   
  5. jsObj = json.dumps(name_emb)      
  6.   
  7. print(name_emb)  
  8. print(jsObj)  
  9.   
  10. print(type(name_emb))  
  11. print(type(jsObj))  

          运行结果如下:

[python] view plain copy

  1. {'a''1111''c''3333''b''2222''d''4444'}  
  2. {"a""1111""c""3333""b""2222""d""4444"}  
  3. <type 'dict'>  
  4. <type 'str'>  

           若在数据写入json文件时,未先进行转换,报错如下

[python] view plain copy

  1. import json    
  2.     
  3. name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}    
  4.             
  5. emb_filename = ('/home/cqh/faceData/emb_json.json')    
  6.     
  7. # jsObj = json.dumps(name_emb)      
  8.     
  9. with open(emb_filename, "w") as f:    
  10.     f.write(name_emb)    
  11.     f.close()    

           转换后再写入,则不报错

 2、json.loads()

          json.loads()用于将str类型的数据转成dict。

[python] view plain copy

  1. import json  
  2.    
  3. name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}   
  4.   
  5. jsDumps = json.dumps(name_emb)      
  6.   
  7. jsLoads = json.loads(jsDumps)   
  8.   
  9. print(name_emb)  
  10. print(jsDumps)  
  11. print(jsLoads)  
  12.   
  13. print(type(name_emb))  
  14. print(type(jsDumps))  
  15. print(type(jsLoads))       

          运行结果如下:

         'a'变成了u'a'是因为发生了类型转换,str会转换成unicode

[python] view plain copy

  1. {'a''1111''c''3333''b''2222''d''4444'}  
  2. {"a""1111""c""3333""b""2222""d""4444"}  
  3. {u'a': u'1111', u'c': u'3333', u'b': u'2222', u'd': u'4444'}  
  4. <type 'dict'>  
  5. <type 'str'>  
  6. <type 'dict'>  

 3、json.dump()

         json.dump()用于将dict类型的数据转成str,并写入到json文件中。下面两种方法都可以将数据写入json文件

[python] view plain copy

  1. import json    
  2.     
  3. name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}    
  4.             
  5. emb_filename = ('/home/cqh/faceData/emb_json.json')    
  6.   
  7. # solution 1  
  8. jsObj = json.dumps(name_emb)      
  9. with open(emb_filename, "w") as f:    
  10.     f.write(jsObj)    
  11.     f.close()    
  12.       
  13. # solution 2     
  14. json.dump(name_emb, open(emb_filename, "w"))  

          运行结果如下:

  4、json.load()

          json.load()用于从json文件中读取数据。

[python] view plain copy

  1. import json    
  2.   
  3. emb_filename = ('/home/cqh/faceData/emb_json.json')    
  4.   
  5. jsObj = json.load(open(emb_filename))      
  6.   
  7. print(jsObj)  
  8. print(type(jsObj))  
  9.   
  10. for key in jsObj.keys():  
  11.     print('key: %s   value: %s' % (key,jsObj.get(key)))  

 运行结果如下:

[python] view plain copy

  1. {u'a': u'1111', u'c': u'3333', u'b': u'2222', u'd': u'4444'}  
  2. <type 'dict'>  
  3. key: a   value: 1111  
  4. key: c   value: 3333  
  5. key: b   value: 2222  
  6. key: d   value: 4444  

<think>嗯,用户之前问了关于如何判断字典类型的问题,现在他们又在问关于jsondumpdumpsloadloads这几个函数。看起来他们可能在处理数据序列化或者API交互的时候遇到了问题,需要了解如何将Python对象转换成JSON格式,或者反过来。 首先,我需要回忆一下json模块这几个函数的区别。用户可能分不清这四个函数的不同用途,特别是dumpdumpsloadloads之间的区别。通常,带s的函数(dumpsloads)是处理字符串的,而不带s的则是处理文件操作的。 接下来,我需要确定用户的使用场景。他们可能需要在保存数据到文件时使用dump,或者在网络传输中使用dumps将数据转为字符串。同样,读取文件时用load,而解析字符串数据用loads。需要明确每个函数的参数示例,让用户更容易理解。 另外,用户可能会对ensure_ascii参数、indent美化输出这些细节感兴趣,或者遇到日期时间等不可序列化对象的处理问题。需要提到这些常见问题,并提供解决方法,比如使用default参数或者自定义编码器。 还要注意用户可能的错误,比如尝试序列化非基本类型的数据,或者文件操作时的模式错误(比如忘记用写入模式打开文件)。在注意事项里应该提醒这些点,帮助他们避免常见的坑。 最后,是否需要扩展其他内容?比如提到性能方面的考虑,或者与其他序列化方式的对比?不过根据问题范围,可能不需要,但可以简要提到处理复杂对象的方法,比如自定义JSONEncoder。这样用户有一个全面的了解,知道如何应对更复杂的情况。</think>在 Python 中处理 JSON 数据时,`json` 模块提供了四个核心方法,它们的区别应用场景如下: --- ### 核心方法对比表 | 方法 | 方向 | 输入/输出 | 典型应用场景 | |------|------|----------|-------------| | `dumps()` | 序列化 | 对象 → JSON字符串 | 将 Python 对象转换为网络传输/存储的字符串 | | `dump()` | 序列化 | 对象 → 文件流 | 直接将 Python 对象写入文件 | | `loads()` | 反序列化 | JSON字符串 → 对象 | 将字符串解析为 Python 对象 | | `load()` | 反序列化 | 文件流 → 对象 | 直接从文件读取并解析为 Python 对象 | --- ### 1. json.dumps() - 对象转字符串 ```python import json data = { "name": "张三", "age": 25, "skills": ["Python", "SQL"] } # 基本用法 json_str = json.dumps(data) print(type(json_str)) # <class 'str'> # 美化输出(缩进+中文不转义) pretty_str = json.dumps(data, indent=2, ensure_ascii=False) ``` --- ### 2. json.dump() - 对象写入文件 ```python # 写入文件(自动处理编码) with open('data.json', 'w', encoding='utf-8') as f: json.dump(data, f, indent=2, ensure_ascii=False) ``` --- ### 3. json.loads() - 字符串转对象 ```python # 解析 JSON 字符串 received_str = '{"city": "北京", "temp": 28.5}' parsed_data = json.loads(received_str) print(parsed_data['city']) # 北京 ``` --- ### 4. json.load() - 文件转对象 ```python # 从文件读取 with open('data.json', 'r', encoding='utf-8') as f: loaded_data = json.load(f) ``` --- ### 关键参数说明 | 参数 | 作用 | 示例值 | |------|------|-------| | `indent` | 缩进美化 | 2(空格数) | | `ensure_ascii` | 中文字符处理 | False(显示中文) | | `sort_keys` | 键排序 | True(按字母排序) | | `default` | 处理不可序列化对象 | 自定义处理函数 | --- ### 常见问题处理 #### 处理日期对象 ```python from datetime import datetime def custom_serializer(obj): if isinstance(obj, datetime): return obj.isoformat() raise TypeError("Type not serializable") data = {"time": datetime.now()} json.dumps(data, default=custom_serializer) ``` #### 解析数字格式 ```python # 精确解析大数字(避免转为 float) json.loads('{"id": 12345678901234567890}', parse_int=str) ``` --- ### 注意事项 1. 只支持基本类型转换: - 字典 → JSON Object - 列表/元组 → JSON Array - `str`/`int`/`float`/`bool`/`None` → 对应 JSON 类型 2. 文件操作必须使用正确的模式: - 写入:`open(..., 'w')` - 读取:`open(..., 'r')` 3. 特殊字符会自动转义: ```python json.dumps({"text": "Line1\nLine2"}) # 输出 {"text": "Line1\\nLine2"} ``` --- ### 性能建议 | 场景 | 推荐方法 | |------|---------| | 处理大文件 | 使用 `json.load()`/`json.dump()` 流式处理 | | 高频小数据 | 使用 `json.loads()`/`json.dumps()` | | 需要类型扩展 | 继承 `json.JSONEncoder` 自定义编码器 |
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不过如此1951

如果有收获,可以打赏一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值