json和pickle序列化模块

TOC

序列化模块

一、什么是序列化模块

将python或者其他语言的数据类型转换成字符串类型

序列:指的是字符串

二、序列化与反序列化

2.1 序列化:serializable

  • 其他数据类型——>字符串——>文件中

2.2 反序列化:

  • 文件中——>字符串——>其他数据类型

三、实现序列化的两种模块

3.1 json(第三方的)

json是一个“第三方”的特殊数据格式

3.1.1 为什么要使用json

为了让不同编程语言之间数据可以共享

3.1.2 json的序列化流程

序列化流程:

python数据类型——>json数据类型——>字符串——>文件中

ps:在json中,所有的字符串都是双引号

反序列化流程:

文件中——>字符串——>json数据类型——>python数据类型

扫描二维码关注公众号,回复: 7909262 查看本文章

3.1.3 json的语法

import json

json.dumps(f.write())  # 序列化
json.loads(f.read())  # 反序列化

# 直接传入f的句柄,省略了f.write 
json.dump(f)  # 序列化,并将数据内容写入文件,内部实现f.write()
# 直接传入f的句柄,省略了f.read
json.load(f)  # 反序列化,从文件中读取数据,内部实现f.read()

# ps: 保存为json数据时,用.json作为文件的后缀名

3.1.4 json的例子

列表转换:

import json
# 给定一个列表
list1 = ['123', '321']
# ensure_ascii默认为True,改为False,可以在控制台看到中文,否则看到的是bytes类型数据
json_str = json.dumps(list1, ensure_ascii=False)  # dumps,将列表序列化
print(json_str)
print(type(json_str))  # 是一个字符串类型


["123", "321"]
<class 'str'>

元组转换:

import json
tuple1 = ('张全蛋', '李小花')

json_str = json.dumps(tuple1, ensure_ascii=False)
print(json_str)
print(type(json_str))


["张全蛋", "李小花"]
<class 'str'>

字典转换:

import json
dic1 = {
    'name': 'tank',
    'age': 17
}

json_str = json.dumps(dic1, ensure_ascii=False)
print(json_str)
print(type(json_str))



{"name": "tank", "age": 17}
<class 'str'>

反序列化

import json
dic1 = {
    'name': 'tank',
    'age': 17
}

json_str = json.dumps(dic1, ensure_ascii=False)

python_data = json.loads(json_str)  # 将文件中的字符串读出来,并还原成字典
print(python_data)
print(type(python_data))



{'name': 'tank', 'age': 17}
<class 'dict'>

3.1.5 注册功能

以保证用户的信息是以字典的形式存入文件中

import json


def json_info():
    user_name = input('请输入用户名:').strip()
    if user_name.isalnum():
        while True:
            password = input('请输入密码:').strip()
            re_password = input('请再次输入密码确认:').strip()
            if password != re_password:
                print('两次密码不一致!')
                continue
            if password == re_password:
                # 定义字典,用于后面传值
                info_dic = {
                    'name': user_name,
                    'pwd': password
                }
                # 将字典序列化
                json_str = json.dumps(info_dic, ensure_ascii=False)
                # 注意: 保存json数据时,用.json作为文件的后缀名
                with open('user.json', mode='a', encoding='UTF-8') as wf:
                    wf.write(json_str)
                print('注册成功!')
                break

    else:
        print('请输入数字或者字母!')


json_info()

3.1.6 dump和load

import json
user_dic = {
    'username': 'tank',
    'password': 123
}
f = open('user2.json', 'w', encoding='utf-8')
json.dump(user_dic, f)
f.close()

with open('user3.json', 'w', encoding='utf-8') as f:
    json.dump(user_dic, f)

with open('user3.json', 'r', encoding='utf-8') as f:
    user_dic = json.load(f)
    print(user_dic)
    print(type(user_dic))

3.2 pickle(python的)

3.2.1 什么是pickle模块

pickle是一个python自带的序列化模块

3.2.2 pickle模块的优缺点

优点:

  • 可以支持python中所有的数据类型
  • 可以直接存“bytes类型”的数据,pickle存取速度更快

缺点:(致命)

  • 只能支持python去使用,不能跨平台

3.2.3 pickle模块的语法

    • pickle.dump()
    • pickle.load()

3.2.4 pickle的例子

写的例子

import pickle

set1 = {'tank', 'sean', 'json', '大饼'}

# 写 dump
# 文件的后缀应该是.pickle
with open('teacher.pickle', 'wb') as wf:
    pickle.dump(set1, wf)

读的例子

import pickle
with open('teacher.pickle', 'rb') as rf:
    python_set = pickle.load(rf)
    print(python_set)




猜你喜欢

转载自www.cnblogs.com/cnhyk/p/11891025.html