pickle json模块

pickle --- Python 对象序列化

通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

警告pickle 模块并不安全。你只应该对你信任的数据进行unpickle操作。
构建恶意的 pickle 数据来在解封时执行任意代码是可能的。
绝对不要对不信任来源的数据和可能被篡改过的数据进行解封。
在你处理不信任数据时,更安全的序列化格式如 json 可能更为适合

# 将 obj 封存以后的对象作为 bytes 类型直接返回,而不是将其写入到文件
pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None)

# 重建并返回一个对象的封存表示形式 data 的对象层级结构。 data 必须为 bytes-like object
pickle.loads(data, *, fix_imports=True, encoding="ASCII", 
             errors="strict", buffers=None)
 
>>> a = [1, 2, 3, 4]
>>> 
>>> b = pickle.dumps(a)  # dumps()
>>> 
>>> b
b'\x80\x04\x95\r\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03K\x04e.'
>>> 
>>> c = pickle.loads(b) # loads()
>>> c
[1, 2, 3, 4]

# 将对象 obj 封存以后的对象写入已打开的 file object file
pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)

# 从已打开的 file object 文件 中读取封存后的对象,重建其中特定对象的层次结构并返回
pickle.load(file, *, fix_imports=True, encoding="ASCII",
            errors="strict", buffers=None)

>>> def code():
...     print('嘿嘿')
... 
>>> with open('a.txt', 'wb') as fp: #dump()
...     pickle.dump(code, fp)
... 
>>> with open('a.txt', 'rb') as fp: #load()
...     pickle.load(fp)()
... 
嘿嘿

json --- JSON 编码和解码器

是一个受 JavaScript 的对象字面量语法启发的轻量级数据交换格式

Python 编码为 JSON 类型转换对应表:

PythonJSON
dictobject
list, tuplearray
strstring
int, float, int- & float-derived Enumsnumber
Truetrue
Falsefalse
Nonenull

JSON 解码为 Python 类型转换对应表:

JSONPython
objectdict
arraylist
stringstr
number (int)int
number (real)float
trueTrue
falseFalse
nullNone
# json.dumps 用于将 Python 对象编码成 JSON 字符串
json.dumps(obj, skipkeys=False, ensure_ascii=True,
           check_circular=True, allow_nan=True, cls=None, indent=None, 
           separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
      # 如果 ensure_ascii 是 true (即默认值),输出保证将所有输入的非 ASCII 字符转义
      # 如果 ensure_ascii 是 false,这些字符会原样输出
      # 如果 sort_keys 是 true(默认为 False),那么字典的输出会以键的顺序排序

>>> dic = { '张三':{'age': '16',
...             'like':'打球',},
...         '李四':{'age': '19',
...             'like':'游泳',}
...         }
>>> 
>>> json.dumps(dic, ensure_ascii=False)
'{"张三": {"age": "16", "like": "打球"}, "李四": {"age": "19", "like": "游泳"}}'

# json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型
json.loads(s, *, cls=None, object_hook=None, 
           parse_float=None, parse_int=None, parse_constant=None,                  
           object_pairs_hook=None, **kw)

>>> json.loads(json.dumps(dic))
{'张三': {'age': '16', 'like': '打球'}, '李四': {'age': '19', 'like': '游泳'}}


#---------
>>> dic = { '张三':{'age': '16',
...             'like':'打球',},
...         '李四':{'age': '19',
...             'like':'游泳',}
...         }
>>> 
>>> with open('a.txt', 'w', encoding='utf-8') as fp:
...     json.dump(dic, fp, ensure_ascii=False)
... 
>>> 
>>> with open('a.txt', 'r', encoding='utf-8') as fp:
...     json.load(fp)
... 
{'张三': {'age': '16', 'like': '打球'}, '李四': {'age': '19', 'like': '游泳'}}
>>>

小结:pickle模块可以连续的dump和load。每一次的dump会在结尾的地方加上一个结束标记
json模块可以连续的dump,但是结束的时候没有结束标记。
想要连续load,需要自定义结束标记,让以标记为循环的去load数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值