python序列化 pickle,json模块

Python中用于序列化的两个模块

  • json     用于【字符串】和 【python基本数据类型】 间进行转换
  • pickle   用于【python特有的类型】 和 【python基本数据类型】间进行转换

Json模块提供了四个功能:dumps、dump、loads、load

pickle模块提供了四个功能:dumps、dump、loads、load

pickle.dump[ojb, file [,protocol]

  序列化对象,并将结果数据流写入到文件对象中。

  必填参数ojb表示要封装的对象

  必填参数file表示ojb写入的文件对象,file文件必须是二进制的模式打开,如‘rb’

  参数protocol是序列化模式,默认值为0。

pickle.load(file)
  反序列化对象。将文件中的数据解析为一个Python对象。

  必填参数file必须以二进制可读模式打开,即“rb”,其他都为可选参数

pickle.dumps(obj)

  以字节对象形式返回封装的对象,不需要写入文件中

pickle.loads(bytes_object):

  从字节对象中读取被封装的对象,并返回

pickle可能出现三种异常:

    1. PickleError:封装和拆封时出现的异常类,继承自Exception

    2. PicklingError: 遇到不可封装的对象时出现的异常,继承自PickleError

    3. UnPicklingError: 拆封对象过程中出现的异常,继承自PickleError

下面是一个修改文件的例子:

import pickle

account = {
    'xiaoming' :{
        'name' : 'mingrizhaoyang',
        'emai' : '2556688@qq.com',
        'password' : 'abc123',
        'balance' : 10000,
        'bank_acc' : {
            'ICB' : '23123123123',
            'CCB' : '28321831823123'
        }

    },
    'xiaohong' :{
            'name' : 'buzhibujue',
            'emai' : '333333@qq.com',
            'password' : 'qaq123',
            'balance' : 10000,
            'bank_acc' : {
                'ICB' : '12372847384',
                'CCB' : '12324452661'
            }
    }
}
with open('acc_data', 'wb') as f:
    pickle.dump(account, f)
import pickle,pprint
with open('acc_data', 'rb') as fb:
    data = pickle.load(fb)
    pprint.pprint(data)
import pickle
fb = open('acc_data', 'rb')
ac_data = pickle.load(fb)                      #也可以   c_data = pickle.loads(fb.read())   
ac_data["xiaohong"]['balance'] = ac_data["xiaohong"]['balance'] - 1000
fb.close()                                                

with open('acc_data', 'wb') as f:
    pickle.dump(ac_data, f)                    #也可以 f.write(pickle.dumps(ac_data))

 JSON

  

import json

account = {
    'xiaoming' :{
        'name' : 'mingrizhaoyang',
        'emai' : '2556688@qq.com',
        'password' : 'abc123',
        'balance' : 10000,
        'bank_acc' : {
            'ICB' : '23123123123',
            'CCB' : '28321831823123'
        }

    },
    'xiaohong' :{
            'name' : 'buzhibujue',
            'emai' : '333333@qq.com',
            'password' : 'qaq123',
            'balance' : 10000,
            'bank_acc' : {
                'ICB' : '12372847384',
                'CCB' : '12324452661'
            }
    }
}
with open('acc_data', 'w') as f:
    json.dump(account, f)
import json
with open('acc_data', 'r') as fb:
    data = json.load(fb)
    print(data)
import json                                                                      
# with open('acc_data', 'r') as fb:                                              
#     data = json.load(fb)                                                       
fb = open('acc_data', 'r')                                                       
data = json.load(fb)                                                             
data["xiaohong"]['balance'] = data["xiaohong"]['balance'] - 1000                 
with open('acc_data', 'w') as f:                                                 
    json.dump(data, f)                                                           

 json.loads

  用于将形式字典、列表、元祖的字符串,转换成dict、list、tuple

  

import json
t1 = '{"l":"123", "p":"456"}'
t2 = "[11, 22, 33, 44]"
result1 = json.loads((t1))
result2 = json.loads(t2)
print(result1,result2)

》》》{'p': '456', 'l': '123'} [11, 22, 33, 44]

  json,dumps()

  将python基本数据类型转换成字符串

  

import json
li = [11, 22, 33, 44]
result = json.dumps(li)
print(result,type(result))

》》》[11, 22, 33, 44] <class 'str'>

  

json load and dump

import json
dic = {"l":"123", "p":"456"}
json.dump(dic, open("db", 'w')) #将基础类型转换成字符串,写进文本

re = json.load(open("db","r"))      #读取文本信息,转换成基础类型
print(re)

  

原文地址:https://www.cnblogs.com/waylon/p/6598947.html