[ python ] 序列化模块

什么叫序列化:
    将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。

序列化的目的:
    1. 以某种存储形式使自定义对象持久化
    2. 将对象从一个地方传递到另一个地方
    3. 使程序更具维护性

json 模块

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

import json

dic = {‘k1‘:1, ‘k2‘: 2, ‘k3‘: 3}

# 序列化
str_dic = json.dumps(dic)   # dumps 就是将字典类型转换为字符串类型
print(type(str_dic), str_dic)

# 执行结果:
# <class ‘str‘> {"k1": 1, "k2": 2, "k3": 3}

# 反序列化
dic2 = json.loads(str_dic)  # loads 将字符串类型转换为字典类型
print(type(dic2), dic2)

# 执行结果:
# <class ‘dict‘> {‘k2‘: 2, ‘k3‘: 3, ‘k1‘: 1}

dumps 和 loads

dumps 和 loads 都是在内存中对数据进行操作,并没有将序列化后的数据保存到硬盘,程序退出,数据消失。如果要将序列化后的数据永久的保存起来,就需要使用 dump 和 load 来操作:

import json

dic = {‘k1‘:1, ‘k2‘: 2, ‘k3‘: 3}
with open(‘test.json‘, ‘w‘, encoding=‘utf-8‘) as f:
    json.dump(dic, f)   # dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件

dump 持久序列化到文件

with open(‘test.json‘, ‘r‘, encoding=‘utf-8‘) as f:
    dic = json.load(f)  # load 方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回

print(type(dic), dic)

# 执行结果:
# <class ‘dict‘> {‘k2‘: 2, ‘k3‘: 3, ‘k1‘: 1}

load从文件中反序列化

当序列化中数据含有中文,建议添加ensure_ascii关键字参数来进行序列化,这样在json文件中依然会显示中文

import json
dic = {‘k1‘: ‘中国‘, ‘k2‘: ‘美国‘, ‘k3‘: 3}
with open(‘file.json‘, ‘w‘, encoding=‘utf-8‘) as f:
    json.dump(dic, f, ensure_ascii=False)

ensure_ascii关键字参数

json的格式化输出:

import json
data = {‘username‘:[‘小明‘,‘baby‘],‘sex‘:‘male‘,‘age‘:16}
json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(‘,‘,‘:‘),ensure_ascii=False)
print(json_dic2)

执行结果:

{
  "age":16,
  "sex":"male",
  "username":[
    "小明",
    "baby"
  ]
}

json格式化输出

实例:

使用 json 模块实现用户注册登录:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey
import json
import os

def file_oper(file, mode, *args):
    if mode == ‘w‘:
        user_info = args[0]
        with open(file, mode) as f:
            json.dump(user_info, f)
    elif mode == ‘r‘:
        with open(file, mode) as f:
            user_info = json.load(f)
        return user_info

def regist(file):
    user_dict = file_oper(file, ‘r‘)
    while True:
        username = input(‘username:‘).strip()
        if not username: continue
        if username in user_dict:
            print(‘\033[31;1m错误:用户名已存在.\033[0m‘)
        else:
            break

    password = input(‘password:‘).strip()
    user_dict[username] = password
    file_oper(file, ‘w‘, user_dict)
    print(‘\033[32;1m注册成功.\033[0m‘)

def login(file):
    user_dict = file_oper(file, ‘r‘)
    while True:
        username = input(‘username:‘).strip()
        if not username: continue
        if username not in user_dict:
            print(‘\033[32;1m错误:用户名不存在.\033[0m‘)
        else:
            break
    password = input(‘password:‘).strip()
    if user_dict[username] == password:
        print(‘\033[32;1m登录成功.\033[0m‘)
    else:
        print(‘\033[31;1m密码错误.\033[0m‘)

def showmenu():
    if not os.path.isfile(‘user_json.db‘):
        file_oper(‘user.db‘, ‘w‘, {})
    while True:
        print(‘1. 注册\n‘
              ‘2. 登录\n‘
              ‘3. 退出‘)
        choice = input(‘>>>‘).strip()
        if choice == ‘1‘:
            regist(‘user.db‘)
        elif choice == ‘2‘:
            login(‘user.db‘)
        elif choice == ‘3‘:
            break
        else:
            print(‘\033[31;1m错误:输入错误.\033[0m‘)

if __name__ == ‘__main__‘:
    showmenu()

json 用户注册和登录

pickle 模块

json模块和pickle模块对比:

  • json,用于字符串和python部分数据类型间进行转换
  • pickle,用于python特有的类型和python的数据类型间进行转换

pickle模块提供了四个功能:dumps、dump(序列化,存储)、loads(反序列化,读)、load(不仅可以序列化字典,列表...可以把python中任意的数据类型序列化)

pickle模块的使用

dumps
import pickle

dic = {‘k1‘: 1, ‘k2‘: 2, ‘k3‘: 3}

str_dic = pickle.dumps(dic) # 使用dumps进行序列化,序列化后是一串字节类型的数据。
print(str_dic)

# 执行结果:
# b‘\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K\x01X\x02\x00\x00\x00k2q\x02K\x02X\x02\x00\x00\x00k3q\x03K\x03u.‘

pickle.dumps序列化

import pickle

dic2 = pickle.loads(b‘\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K\x01X\x02\x00\x00\x00k2q\x02K\x02X\x02\x00\x00\x00k3q\x03K\x03u.‘)
print(dic2) # loads进行反序列化得到结果

# 执行结果:
# {‘k2‘: 2, ‘k3‘: 3, ‘k1‘: 1}

pickle.loads反序列化

dump 和 load

import pickle
l1 = [1, 2, 3, 4, 5, 6, ‘hehe‘, ‘haha‘]
with open(‘file.json‘, ‘wb‘) as f:    # 这里必须使用 ‘wb‘进行写入操作且不用指定字符编码
    pickle.dump(l1, f)

pickle.dump序列化

import pickle
with open(‘file.json‘, ‘rb‘) as f:    # 这里必须使用 ‘rb‘进行读取操作且不用指定字符编码
    l2 = pickle.load(f)

print(l2)

# 执行结果:
# [1, 2, 3, 4, 5, 6, ‘hehe‘, ‘haha‘]

pickle.load反序列化

实例:

使用 pickle 模块实现用户注册登录:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey
import pickle
import os

def file_oper(file, mode, *args):
    if mode == ‘wb‘:
        user_info = args[0]
        with open(file, mode) as f:
            pickle.dump(user_info, f)
    elif mode == ‘rb‘:
        with open(file, mode) as f:
            user_info = pickle.load(f)
        return user_info

def regist(file, user_dict):
    while True:
        username = input(‘username:‘).strip()
        if not username: continue
        if username in user_dict:
            print(‘\033[31;1m错误:用户名已存在.\033[0m‘)
        else:
            break

    password = input(‘password:‘).strip()
    user_dict[username] = password
    file_oper(file, ‘wb‘, user_dict)
    print(‘\033[32;1m注册成功.\033[0m‘)

def login(user_dict):
    while True:
        username = input(‘username:‘).strip()
        if not username: continue
        if username not in user_dict:
            print(‘\033[32;1m错误:用户名不存在.\033[0m‘)
        else:
            break
    password = input(‘password:‘).strip()
    if user_dict[username] == password:
        print(‘\033[32;1m登录成功.\033[0m‘)
    else:
        print(‘\033[31;1m密码错误.\033[0m‘)

def showmenu():
    if not os.path.isfile(‘user.db‘):
        file_oper(‘user.db‘, ‘wb‘, {})
    user_dict = file_oper(‘user.db‘, ‘rb‘)
    while True:
        print(‘1. 注册\n‘
              ‘2. 登录\n‘
              ‘3. 退出‘)
        choice = input(‘>>>‘).strip()
        if choice == ‘1‘:
            regist(‘user.db‘, user_dict)
        elif choice == ‘2‘:
            login(user_dict)
        elif choice == ‘3‘:
            break
        else:
            print(‘\033[31;1m错误:输入错误.\033[0m‘)

if __name__ == ‘__main__‘:
    showmenu()

pickle 用户注册和登录

shelve 模块

shelve是一个简单的数据存储方案,他只有一个函数就是open(),这个函数接收一个参数就是文件名,并且文件名必须是.bat类型的。然后返回一个shelf对象,可以简单的当作一个字典,当你存储完毕的时候,就调用close函数来关闭。

永久存储数据

import shelve
she = shelve.open(‘user‘)
she[‘xiaom‘] = [‘male‘, 20] # 字典的形式,添加一个列表
she[‘xiaom‘].append(‘aaa‘)  # 新增一个元素
she.close()

-----------------------------------------

import shelve
s = shelve.open(‘user‘)
print(s[‘xiaom‘])
s.close()

# 执行结果:
# [‘male‘, 20]

在上面的例子中,新增的元素并没有持久保存在文件中。

这是由于shelve在默认情况下是不会记录持久化对象的任何修改,所以在shelve.open()时候需要修改默认参数,否则对象的修改不会保存。

回写模式 (writeback=True)

import shelve
she = shelve.open(‘user‘, writeback=True)   # 开启回写模式
she[‘xiaom‘] = [‘male‘, 20] # 字典的形式,添加一个列表
she[‘xiaom‘].append(‘aaa‘)  # 新增一个元素
she.close()

-----------------------------------------

import shelve

s = shelve.open(‘user‘)
print(s[‘xiaom‘])
s.close()

# 执行结果:
# [‘male‘, 20, ‘aaa‘]    # 新增或修改的内容持久化成功

实例:

使用 shelve 模块实现用户注册登录:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey
import shelve, hashlib

db = shelve.open(‘user.db‘, writeback=True)

def regist():
    global db
    while True:
        username = input(‘username:‘).strip()
        if not username: continue
        if username in db:
            print(‘\033[31;1m错误:用户名已存在.\033[0m‘)
        else:
            break
    password = input(‘password:‘).strip()
    md5 = hashlib.md5()
    md5.update(password.encode())
    password_md5 = md5.hexdigest()
    db[username] = {‘password‘: password_md5}

def login():
    global db
    username = input(‘username:‘).strip()
    password = input(‘password:‘).strip()
    md5 = hashlib.md5()
    md5.update(password.encode())
    password = md5.hexdigest()
    if username in db:
        password_md5 = db[username].get(‘password‘)
        if password == password_md5:
            print(‘\033[32;1m登录成功.\033[0m‘)

def showmenu():
    global db
    while True:
        print(‘1. 注册\n‘
              ‘2. 登录\n‘
              ‘3. 退出‘)
        choice = input(‘>>>‘).strip()
        if choice == ‘1‘:
            regist()
        elif choice == ‘2‘:
            login()
        elif choice == ‘3‘:
            break
        else:
            print(‘\033[31;1m序号错误.\033[0m‘)
    db.close()

if __name__ == ‘__main__‘:
    showmenu()

shelve 用户注册和登录

json 、 pickle 、 shelve 三个模块使用场景及对比如下:

  1. json在任何编程语言都是通用的格式,因此在多语言编程数据对接使用,但是在python中只有部分数据类型(str、list、dict)能够被序列化;
  2. pickle 是python语言所独有的,能够序列化任何 python 中的数据类型;
  3. shelve 是一个类似dict的对象,更加简单易用。

在上面三个 用户注册登录 实例中,不难发现使用 shelve 模块实现思路是最简单的。

原文地址:https://www.cnblogs.com/hukey/p/9791182.html

时间: 2024-08-30 09:51:53

[ python ] 序列化模块的相关文章

25.Python序列化模块,hashlib模块, configparser模块,logging模块,异常处理

一.序列化模块 什么叫序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来.但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中.你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?没错序列化的过程就是从dic 变成str(di

Python序列化模块pickle和json使用和区别

这是用于序列化的两个模块: ? json: 用于字符串和python数据类型间进行转换 ? pickle: 用于python特有的类型和python的数据类型间进行转换 Json模块提供了四个功能:dumps.dump.loads.load pickle模块提供了四个功能:dumps.dump.loads.load 那pickle和json有什么区别呢? json是可以在不同语言之间交换数据的,而pickle只在python之间使用. json只能序列化最基本的数据类型,而pickle可以序列化

python序列化模块json和pickle

序列化相关 1. json 应用场景: json模块主要用于处理json格式的数据,可以将json格式的数据转化为python的字典,便于python处理,同时也可以将python的字典或列表等对象转化为json格式的数据,便于跨平台或跨语言进行数据交互 功能: Json模块提供了四个功能:dumps.dump.loads.load Python 编码为 JSON 类型转换对应表: Python JSON dict object list, tuple array str string int,

python序列化模块

1. 序列化一般用于二个地方: 1> 数据存储,如写文件,数据入库 2> 网络上传输数据的时候 2. 序列化/反序列化: 1> 序列化:从数据类型(int,dict,tuple,list等) --> 字符串的过程 2> 反序列化:从字符串 --> 数据类型的过程 3. json (常用模块): 1> 通用的序列化格式 2> 只有很少的一部分数据类型能通过json转化为字符串 3>  json能序列化的数据类型有:数字,字符串,列表,字典,元组(序列化时

Python序列化模块-Pickel写入和读取文件

利用pickle 存储和读取文件 1.存储文件: #引入所需包,将列表元素存入data2的文件里面 import pickle mylist2 ={'1','nihao','之后','我们',1,2,3,4} #不可以存list pk_file = open(r'c:\Temp\pickel.txt', 'wb') # 注意一定要写明是wb 而不是w. #最关键的是这步,将内容装入打开的文件之中(内容,目标文件) pickle.dump(mylist2, pk_file) #必须内容在前,文件名

python开发模块基础:序列化模块json,pickle,shelve

一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来.但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中.你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?没错序列化的过程就是从dic 变成str(dic)的

Python模块-logging、序列化模块、re模块

MarkdownPad Document logging模块 import logging   logging.debug('debug message')   logging.info('info message')   logging.warning('warning message')   logging.error('error message')   logging.critical('critical message') 运行结果: C:\Python36\python.exe C:

python模块之sys模块和序列化模块

sys模块 sys模块是与python解释器交互的一个接口 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 序列化模块 序列化的目的: 以某种存储形式使自定义对象持久化 将对象从一个地方传递到另一个地

python之模块 marshal(序列化)---没理解

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块 marshal(序列化) #来自:mldxs import marshal data1 = ['abc',12,23,'jb51'] data2 = {1:'aaa',"b":'dad'} data3 = (1,2,4) output_file = open("a.txt",'wb')#把这些数据序列化到文件中,注:文件必须以二进制模式打开 marshal