python 序列化


1 什么叫序列化

在我们存储数据或网络传输数据时候,需要多我们对象进行处理,把对象处理成方便储存和网络传输的数据格式,这个过程叫做序列化

2 对象序列化有三种方式;

2.1 pickle 可以将python中任意数据类型转换成bytes并写入文件中,同样可以把文件中写好的bytes转化成python的相对应的数据,这个过程称为反序列化;

import pickle 
# 可以将对象写入文件中
#基本用法
#pickle.dump(obj,file,protocol=None,*,fix_imports=True)可以写入到文本中
#pickle.dump(obj,protocol=None,* fix_import=True) 一般用于正常的操作
# pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict") 可以从文本加载
# pickle.loads(s, *, fix_imports=True, encoding="ASCII", errors="strict") 一般用于正常的操作
举例说明:
import pickle
class Person:
  def __init__(self, name, age):
      self.name = name
      self.age=age

  def login(self):
      pass
李明 = Person('李明',20)
王汪 = Person('王汪',19)
孙艳 = Person('孙艳',18)
# S1 = pickle.dumps(李明) # 序列化一个对象,将对象转换成bytes的形式
# S2 = pickle.loads(S1) # 进行反序列化,将bytes转换对象
li = [李明,王汪,孙艳]
with open('user',mode='ab') as f:
  pickle.dump(li, f) # 把列表转化butes,写入文件
with open('user',mode='rb') as f:
li= pickle.load(f) # 从文本中读取,将bytes的形式转化为列表
print(li)
for i in li:
  print(i)

简单注册和登录的例子:
class Account:
  def __init__(self,name,pwd):
      self.name=name
      self.pwd=pwd
def login():
    username=input('请输入用户:').strip()
    userpwd=input('请输入密码:').strip()
    with open('usernamelist',mode='rb') as f:
      while True:
      try:
        Account_User=pickle.load(f)
        if username==Account_User.name and userpwd==Account_User.pwd:
          print('登录成功')
          return True
      except:
          print('输入用户名和密码不对')
          return False
def regiest():
    while True:
    username=input("请输入用户名:").strip()
    with open('usernamelist',mode='rb') as f:
      while True:
        try:
        Account_User=pickle.load(f)
        except: EOFError
        if username==Account_User.name:
          print('用户名已存在,请重新选择用户名')
          break
        else:
        while True:
          userpwd=input("请输入用户密码:").strip()
          userpwd2=input('请再次输入密码:').strip()
          if userpwd==userpwd2:
            Account_User=Account(username,userpwd)
            with open('usernamelist',mode='ab') as f:
              pickle.dump(Account_User,f)
              return True
          else:
            print('二次密码输入不一致,请重试输入秘密')
def run():
while 1:
  opt_lst=[('登录', 'login'), ('注册', 'regiest'), ('退出', 'exit')]

  for index,lst in enumerate(opt_lst,1):
      print(lst[0],index)
  try:
    num=int(input('请输入对应序号:').strip())
  except: EOFError
  if hasattr(opt_lst[num-1][1],opt_lst[num - 1][1]):
      getattr(opt_lst[num-1][1],opt_lst[num-1][1])()
  if num==1: login()
  elif num==2: regiest()
  else: break
  # print(opt_lst[num-1][1])
  # # if hasattr(opt_lst[num-1][1],opt_lst[num-1][1]):
  # getattr(opt_lst[num-1][1],opt_lst[num-1][1])()

if __name__=='__main__':
  run()


   
 

2.2 shelve 简单另类一种序列化方法,可以作为小型数据库使用

2.3 json 将python中常见的字典,列表转换字符,是目前前后端数据交换使用频率最高一种数据格式

import json

# json.dumps()
# 把字典转换成json字符串
# json.loads()
# 把json字符串转化成字典
# json.dump()
# 把字典转换成json字符串.写入到文件
# json.load()
# 把文件中的json字符串读取.转化成字典
dic = {'输出':'鲁班','坦克':'项羽','法师':'安琪拉了'}
gg = json.dumps(dic,ensure_ascii=False) #ensure_ascii=False,是能够看到中文
print(gg)#{"输出": "鲁班", "坦克": "项羽", "法师": "安琪拉了"}
print(type(gg))#<class 'str'>

bb = '{"输出": "鲁班", "坦克": "项羽", "法师": "安琪拉"}'
gg = json.loads(bb)
print(gg)#{'输出': '鲁班', '坦克': '项羽', '法师': '安琪拉'}
print(type(gg))#<class 'dict'>
gg = json.dump(dic,open('json.data','w',encoding='utf-8'),indent=4,ensure_ascii=False)
print(gg)#None # ensure_ascii=False 保存到文件的时候不使用ascii 编码
print(type(gg))#<class 'NoneType'>

dd = json.load(open('json.data','r',encoding='utf-8'))
print(type(dd))#<class 'dict'>
print(dd)#{'输出': '鲁班', '坦克': '项羽', '法师': '安琪拉了'
#将一个类的属性保存到json中
class Person:
  def __init__(self,name,func):
      self.name = name
      self.func = func


# ensure_ascii=True 保存到文件的时候不使用ascii 编码
a = Person('鲁班','射手')
# 方案1,通过类的特殊方法
dd = json.dumps(a.__dict__,ensure_ascii=False)
print(dd)

# 方案2,通过自己建立转换模板
def gg(obj):
  print('哈哈')
  return {'kk':obj.name,'fn':obj.func}#
hh = json.dumps(a,default=gg,ensure_ascii=False) #{"kk": "鲁班", "fn": "射手"}
print(hh)
# 将jsonz字符串转换为对象
def gg(dic):
  return Person(dic['kk'],dic['fn'])
a = '{"kk": "鲁班", "fn": "射手"}'
print(json.loads(a,object_hook=gg))
hh = json.loads(a,object_hook=gg)
print(hh.name)

default = 把对象转化成字典. 需要自己写转换过程 object_hook = 把字典转化成对象. 需要自己写转换过程

python---序列化小结的更多相关文章

  1. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  2. python 序列化之JSON和pickle详解

    JSON模块 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类 ...

  3. Python序列化和反序列化

    Python序列化和反序列化 通过将对象序列化可以将其存储在变量或者文件中,可以保存当时对象的状态,实现其生命周期的延长.并且需要时可以再次将这个对象读取出来.Python中有几个常用模块可实现这一功 ...

  4. Java序列化小结

    title: Java序列化小结 date: 2017-05-06 20:07:59 tags: 序列化 categories: Java基础 --- Java序列化就是将一个对象转化成一串二进制表示 ...

  5. python序列化pickle/cPickle

    一.pickle/Cpickle简介 Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人.你会怎么做?这取决于你想要怎么保存,怎么重用,发送给谁.很多游 ...

  6. python序列化与反序列

    python序列化与反序列 在python中提供了两个模块可进行序列化.分别是pickle和json.他们两者的功能都差不多,dumps和dump都是进行序列化,而loads和load则是反序列化. ...

  7. Python 序列化pickle/cPickle模块整理

    Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人.你会怎么做?这取决于你想要怎么保存,怎么重用,发送给谁.很多游戏允许你在退出的时候保存进度,然后你再 ...

  8. 学习笔记:Python序列化常用工具及性能对比

    什么叫序列化?简单来讲就是将内存中的变量数据转而存储到磁盘上或是通过网络传输到远程. 反序列化是指:把变量数据从序列化的对象重新读到内存里. 下面我们一起来看看,python里面序列化常用的json. ...

  9. Python 序列化 pickle/cPickle模块

    Python 序列化 pickle/cPickle模块 2013-10-17 Posted by yeho Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给 ...

  10. Python 序列化与反序列化

    序列化是为了将内存中的字典.列表.集合以及各种对象,保存到一个文件中(字节流).而反序列化是将字节流转化回原始的对象的一个过程. json库 序列化:json.dumps() 反序列化:json.lo ...

随机推荐

  1. Javacv 音视频小工具 - 下载抖音视频

    一.前言 大家好,俗话说的好,学习新的知识后要学以致用,在学习音视频的过程中,你有没有疑问,不知道音视频可以用来做什么.下面举几个例子,比较耳熟能详,被吹到风口的一些场景有:AI 视觉计算, AI 人 ...

  2. Flink 编程接口(Flink SQL Table API DataStream API 和 DataSet API Stateful Stream Process API)

    Flink 根据数据集类型的不同将核心数据处理接口分为两大类,一类是支持批计算的接口DataSet API,另外一类是支持流计算的接口 DataStream API.同时 Flink将数据处理接口抽象 ...

  3. 安全测试之探索 windows 游戏扫雷

    作者:京东工业 宛煜昕 扫雷游戏相信很多人都从小玩过,在那个电脑游戏并不多的时代,扫雷成为玩的热度蛮高的一款游戏之一,然而就在有一次,接触到了一次不寻常的扫雷过程,使得后来我也有了这个冲动,也来做一次 ...

  4. 借AI之势,打破创意与想象的边界

    不要做这个时代的最后一只恐龙. IMMENSE.36氪|作者 1811年11月,英国,诺丁汉市西北一处小镇里,一群愤怒的纺织工人挥舞着锤头与斧子,一窝蜂地冲进车间里,将几台机器砸得粉碎. 后来,这场运 ...

  5. ICMP隐蔽隧道攻击分析与检测(二)

    • ICMP协议流量特征分析 一.ASCII与HEX对照转换表 二.ICMP正常流量分析 经常使用的ping命令就是基于ICMP协议,Windows系统下ping默认传输的是:"abcdef ...

  6. @property、关联关系、继承、多继承

    1.@property使用来修饰属性的,将属性私有化改为公有化,但是可以设置属性条件 格式: class Person: def __init__(self,name,age): self.name ...

  7. Java 框架面试题-Spring Boot自定义配置与自动配置共存

    Spring Boot 是一个快速开发框架,可以简化 Spring 应用程序的开发,其中自定义配置是其中一个非常重要的特性. 在 Spring Boot 中,自定义配置允许开发者以自己的方式来配置应用 ...

  8. ros-python学习样例笔记

    1.通信基本原理介绍 待写 2.三种通信方式的程序样例(python版) 2.1 topic 通信方式(非自定义和自定义) 2.1.1 创建工作空间和topic功能包 在ubuntu中打开命令行,输入 ...

  9. Springboot接入ChatGPT 续

    在之前的文章\(^{[ 1 ]}\)中,原方案的设计,是基于功能实现的角度去设计的,对于功能性的拓展,考虑不全面,结合收到的反馈意见,对项目进行了拓展优化.完成的优化拓展有如下几个方面 固定会话 历史 ...

  10. FBV和CBV的区别(源码分析)

    FBV和CBV源码分析 FBV直接调用user方法执行业务代码 CBV相当于在FBV上面封装了一层 from django.contrib import admin from django.urls ...