• 2018.10.17python学习第二十一天


    序列化

    什么是序列块?

    指的是内存中的数据结构转化为中间格式,并存储到硬盘中

    反序列化:将硬盘上存储的中间格式数据,在还原为内存中的数据

    为什么要序列化?

    ​ 就是为了将数据永久存储,之前学过的文件也能完成持久化存储,但是操作起来非常麻烦

    pickle 模块

    ​ pickle.dump: 序列化

    ​ pickle.load: 反序列化

    ​ pickle.dumps: 序列化

    ​ pickle.loads: 反序列化

    ​ # dump vs dumps load vs loads

    ​ 带s的是帮你封装了write & read 功能,使用更加方便

    eg1:将 name='agon' ,password='123', sex= 'female' 存储到文件中

    方式一:

    import pickle
    user={'name':'agon','password':'123,'gender':'female'}
    with open('userdb.txt','wt',encoding='utf-8') as f:
    	userbytes=pickle.dumps(user)
    	f.write(userbytes)
    

    方式二:

    import pickle
    user={'name':'agon','password':'123,'gender':'female'}
    with open('userdb.txt','wt',encoding='utf-8') as f:
    	pickle.dump(user,f)
    	
    

    eg2:将file 'userdb.txt' 从文件中反序列出来

    方式一:

    import pickle
    with open('userdb.txt','rt',encoding='utf-8') as f:
    	userbytes=f.read()
    	user=pickle.loads(userbytes)
    

    方式二:

    import pickle
    with open('userdb.txt','rt',encoding='utf-8') as f:
    	user=pickle.load(f)
    

    总结:

    pickle就是一种序列化的模块,只有python能够解析

    shelve 模块

    ​ shelve模块,也可用于序列化,与pickle不同之处在于:

    ​ 1.不需要关心文件的模式是什么,直接把他当陈过一个dict来看

    ​ 2.可以直接对数据进行修改,而不用覆盖原来的数据

    ​ 3.pickle 修改数据的化,只能用wb模式来覆盖,而且只能读到第一次读入的数据

    序列化:

    import shelve
    user={'name':'agon'}
    s=shelve.open('userdb.shv')
    s['user']=user
    s.close
    

    反序列化

    import shelve
    s=shelve.open('userdb.shv'.writeback=True)
    print(s['user'])
    s.close
    
    json 模块

    ​ 之前有讲到的pickle & shelve模块序列化后得到的数据,只有python才能解析,但是通常企业

    开发不可能做一个单机程序,都需要联网进行计算机建的交互,我们必须保证这数据能够跨平台使

    用。

    ​ json (java script object notation) java脚本对象表示法。

    ​ 对于开发而言,json就是一种通用的数据格式,任何一种语言都能解析。

    ​ json中的数据类型:

    json python
    {} dict
    [] list
    string " " str ' '
    int/float int/float
    true/false True/ False
    null None

    json 不支持set和duple

    ​ json的语法规范:

    ​ 1.最外层必须是 { } or [ ],最外层用{}较多

    ​ 2.string必须是双引号 “ ”

    eg:json数据格式

    ​	{
    
    ​		“user":[{"name":"agon"},{"name":"aaa"}]
    	}
    

    json模块的核心功能

    ​ json.dump 序列化

    ​ json.dumps 序列化

    ​ json.load 反序列化

    ​ json.load 反序列化

    ​ #和pickle一样,带s的是帮你封装了write & read 功能,使用更加方便

    eg1:将json数据mydic={”user":[{"name":"agon"},{"name":"aaa"}]} 序列化

    方式一:

    import json
    mydic={”user":[{"name":"agon"},{"name":"aaa"}]}
    with open('b.json','wt',encoding='utf-8') as f:
    	res=json.dumps(mydic)
    	f.write(res)
    

    方式二:

    import json
    mydic={”user":[{"name":"agon"},{"name":"aaa"}]}
    with open('b.json','wt',encoding='utf-8') as f:
    	json.dump(mydic,f)
    

    eg2:将文件中的json数据反序列化

    方式一:

    import json
    with open('b.json','rt',encoding='utf-8') as f:
    	readbytes=f.read()
    	json.loads(readbytes)
    

    方式二:

    import json
    with open('b.json','rt',encoding='utf-8') as f:
    	json.load(f)
    

    总结:

    ​ json就是一种数据格式,能被任何语言识别

    xml 模块

    xml (Extensible markup language) 可扩展的标记语言

    也是一种通用的数据格式,可以跨平台

    ​ xml的语法规范:

    ​ 1.一个标签: < name/>

    ​ 2.两个标签:< name> < /name>

    ​ 3.任何的其实标签都有一个结束标签。

    ​ 4.标签必须是按合适的顺序进行嵌套,所以结束标签中同时表示其实和结束i拗钱。这种语

    ​ 法是再大于符号(/),例如<百度百科词条/>。XML解析器会将其翻译成<百度百科词条

    ​ ></百度百科词条>。

    ​ 5.所有的特性都必须有值。

    ​ 6.所有的特性都必须再值的周围嘉善过一个双引号。

    import xml.etree.ElementTree as ElementTree #表示节点树
    # 解析 d.xml
    tree = ElmentTree.parse('d.xml')
    # 获取根标签
    rootTree = tree.getroot()
    

    ​ 三种获取标签的方式

    方式一:

    # 获取所有人的年龄 iter是用于再全文范围获取标签
    for item in rootTree.iter('age'):
    	# 一个标签的三个组成部分
    	print(item.tag)			# 标签名
    	print(item.attrib)		# 标签的属性
    	print(item.text)		# 文本内容
    

    方式二:

    # 从当前标签的子标签中找到一个名称为age的标签 如果有多个 找到的是第一个
    print(rootTree.find('age').attrib
    

    方式三:

    #从当前的子标签中找到所有名称为age的标签
    print(rootTree.findall('age'))
    

    ​ 获取单个属性

    stu = rootTree.find('stu')
    print(stu.get('age'))
    print(stu.get('name'))
    

    ​ 删除子标签

    rootTree.remove(stu)
    

    ​ 添加子标签

    #先创建一个子标签
    newTag = Element.Tree.Element('this is new tag',{'attrib':'value'})
    rootTree.append(newTag)
    
    #写入文件
    tree.write('f.xml',encoding='utf-8')
    

    总结:

    ​ Element常用方法

    ​ getchildren() 获取所有子标签

    ​ find 从子标签中获取名字匹配的第一个子标签

    ​ findall 从子标签中获取匹配名字的所有子标签

    ​ iter 从子全文中获取名字匹配的所有标签,返回迭代器

    ​ get 获取指定属性的值

    ​ append 添加子标签

    ​ remove 删除子标签

    ​ elementTree常用方法

    ​ parse 文本文件转对象

    ​ dump 对象转文本

    ​ write 写入

    ​ getroot 获取根标签

    configparser 模块

    ​ 配置文件解析模块

    ​ 运行程序是一些参数需要用户来决定,这些参数称之为配置信息,配置信息通常就放在一

    ​ 个文件中

    ​ 为什么要配置文件?

    ​ 一些parameter我们不再code中写死,这样扩展性太低,修改需求时必须修改源代码,太

    ​ 麻烦

    ​ 配置文件主要内容

    ​ section 分区

    ​ option 选项,就是一个key=value形式

    ​ 常用功能

    ​ get 用来从配置文件中获取一个配置选项

    ​ read

    ​ set

    ​ sections

    ​ options

    import configparser
    # 创建一个解析器
    config = confingparser.ConfigParser()
    #读取并解析test.cfg
    config.read('test.cfg',encoding='utf-8')
    # 获取需要的信息:
    # 获取所有分区
    print(config.sections())
    # 获取所有选项
    print(config.options('user'))
    # 获取某个选项的值
    print(config.get('path','DB_PATH))
    
    # get返回的都是字符串类型,如果需要转换类型,直接用get+对应的类型(bool,int,float)
    
    print(config.getint('user','age'))
    print(config.get('user','age'))
    
    #是否有某个选项
    config.has_option()
    #是否有某个分区
    config.has_section()                 
                     
    

    总结:

    ​ 配置文件是非常常用的程序扩展方法,其实使用起来非常简单

  • 相关阅读:
    Nbimer族助手 部分控件不能用的解决方法(转)
    jquery中通过全局变量来禁止多次ajax请求
    Three.JS 从世界坐标系转换到屏幕坐标系
    php 判断是手机版还是电脑端
    6个html5页面适配iphone6的技巧
    http://stackoverflow.com/questions/6065169/requestanimationframe-with-this-keyword
    javascript模仿php 函数 trim ltrim rtrim (原创)
    JavaScript中Trim(),TrimStart(),TrimEnd()的实现
    如何定位摄像机,使物体在屏幕上始终具有相同的像素宽度和高度?(threes)
    鸿基台式机安装
  • 原文地址:https://www.cnblogs.com/hello-yuanjing/p/9807127.html
Copyright © 2020-2023  润新知