pyickle模块常用方法

pickle和json差别:

  • json字典value不支持其他对象只支持python原有的结构,但是json由于是转换为string,所以保存的文件是可以使用文本查看器去读取的

  • pickle包则支持各种python的对象,但它写入的是二进制文件,并有自己独特的编码方式,所以是不可以查看的,只能使用python载入

方法 说明
pickle.dumps(iterable) #内容转化成bates
pickle.loads(iterable) #bates 转化成人看的
pickle.dump(dic,句柄) # 用于存文件
pickle.load(句柄) #用于读取文件

dump和load方法实例:

import pickle

dic = {
     'name': "太白金星",
       'hobby_list': ['戒烟', '烫不了头', '戒酒'],
       'age': 18,
       'money': '1个亿'}
s1 = pickle.dumps(dic)
print("s1:", s1)  # 转化成Rb bate 字节类型,不过仅仅支持python 通信
dic2 = pickle.loads(s1)
print("dic2:", dic2)

运行结果:

s1: b'\x80\x04\x95g\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x0c\xe5\xa4\xaa\xe7\x99\xbd\xe9\x87\x91\xe6\x98\x9f\x94\x8c\nhobby_list\x94]\x94(\x8c\x06\xe6\x88\x92\xe7\x83\x9f\x94\x8c\x0c\xe7\x83\xab\xe4\xb8\x8d\xe4\xba\x86\xe5\xa4\xb4\x94\x8c\x06\xe6\x88\x92\xe9\x85\x92\x94e\x8c\x03age\x94K\x12\x8c\x05money\x94\x8c\x071\xe4\xb8\xaa\xe4\xba\xbf\x94u.'
dic2: {
     'name': '太白金星', 'hobby_list': ['戒烟', '烫不了头', '戒酒'], 'age': 18, 'money': '1个亿'}

dumps和loads方法实例:

import pickle

dic = {
     'name': "太白金星",
       'hobby_list': ['戒烟', '烫不了头', '戒酒'],
       'age': 18,
       'money': '1个亿'}
filename = "D:\\test\\p1.pkl"
with open(filename, mode='wb') as f1:
    pickle.dump(dic, f1)


with open(filename, mode='rb') as f2:
    ret = pickle.load(f2)
print(ret)

运行结果:

添加了p1.pkl文件,并且将转化好的数据存进去

添加了p1.pkl文件,并且将转化好的数据存进去

{
     'name': '太白金星', 'hobby_list': ['戒烟', '烫不了头', '戒酒'], 'age': 18, 'money': '1个亿'}

部分问题:

  • pickle模块的追加时写入后有一个问题,读取出来的总是第一个对象。这是因为Pickle 每次序列化生成的字符串有独立头尾,pickle.load() 只会按顺序读取一个完整的结果,所以只需要在 load 一次之后再 load 一次,就能读到第二次序列化的 对象。如果不知道文件里有多少 pickle 对象,可以在 while 循环中反复 load 文件对象,直到抛出异常为止。

代码如下:

with open(filename, mode='rb') as f:
    while True:
        try:
            aa = pickle.load(f)
            print(aa)
        except EOFError:
            break

你可能感兴趣的:(python模块掌握,python)