学习python课程第十九天

一.   各种序列化模块

  一.  pickle 模块

  pickle是一个用来序列化的模块

  序列化是什么?

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

  反序列化?

  将硬盘上存储的中间格式数据在还原为内存中的数据结构

  为什么要序列化?

  就是为了将数据持久储存

  之前学过的文件也能完成持久化存储, 但是操作起来非常麻烦

  pickle模块的主要功能

  dump   load   dumps   loads

  dump 是序列化.  load是反序列化

  不带s的是帮你封装好 write 和 read 的, 它更加方便

  load 函数可以多次执行, 每次load都是往后再读一个对象, 如果没有了就抛出异常  Ran out of input

  示例:

    #  pickle支持python中所有的数据类型

     user = {‘name‘:name , ‘password‘:password , ‘height‘:height , ‘hobby‘:hobby}

    #  序列化的过程

     with open(‘userdb.pkl‘,‘ab‘) as f :

        userbytes = pickle.dumps(user)

         f. write(userbytes)

    #反序列化的过程

     with open(‘userdb.pkl‘,‘rb‘) as f :

         userbytes = f.read()

         user = pickle.loads(userbytes)

       print(user)

    # dump  直接序列化到文件

    with open(‘userdb.pkl‘,‘ab‘) as f:

      pickle.dump(user.f)

    # load 从文件反序列化

    with open(‘userdb.pkl‘,‘rb‘) as f:

      user = pickle.load(f)

      print(user)

      print(pickle.load(f))

  2. shelve 模块

  shelve模块 也用于序列化,

  它与pickle不同之处在于 : 不需要关心文件模式什么的. 直接把它当成一个字典来看待

  它可以直接对数据进行修改  而不用覆盖原来的数据

  而pickle 你想要修改只能 用wb模式来覆盖

  示例:

    import  shelve

    user = {‘name‘:‘高根‘}

    s = shelve.open(‘userdb.shv‘)

    s[‘user‘] = user

    s.close()

    s = shelve.open(‘userdb.shv‘,writeback = True)

    print(s[‘user‘])

    s[‘user‘][‘age‘] = 20

    s.close()

   总结:   可以储存python所有基础数据类型,

        只需要指定文件名字即可, 使用方法与字典类型相同

        其实该模块是对pickle模块的封装, 使用起来更加简单

  3.  json 模块

  pickle 和 shevle 序列化后的得到的数据 只有python才能解析,

  通常企业开发不可能做一个单机程序, 都需要联网进行计算机的交互,

  我们必须保证这个数据能够跨平台使用

  JSON是什么?  java  script  object  notation 就是对象表示法.

  var  obj  = {‘name‘ : ‘egon‘}

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

  json中的数据类型                  python中的数据类型  它俩的对应关系

    { }                                                   字典 {}

    [ ]                                                   列表  []

    string   " "                                       str    ‘ ‘

    int / float                                         int / float  整型, 浮点型

    true / false                                      True / False  布尔值

    null                                                  None 表示空

  

  json 格式的语法规范 :

  最外层通常是一个字典或列表 (字典用的最多)

  { }   or  [ ]

  只要你想写一个json格式的数据. 那么最外层直接写 { }

  字符串必须是双引号

  你可以在里面套任意多的层次

  json 模块的核心功能

  dump     dumps     load    loads     不带s的就是封装 write 和 read 的

  示例:

    # 反序列化

    1.    loads 模式

      import  json

      with open(‘a.json‘,‘rt‘,encoding=‘utf-8‘) as f :

        res = json.loads(f.read())

        print(res)

    

    2.    load 模式

      import  json

      with open(‘a.json‘,‘rt‘,encoding=‘utf-8‘) as f :

        print(json.load(f))

    # 序列化

    1.  dumps 模式

     with open(‘b.json‘,‘wt‘,encoding=‘utf-8‘) as f:

        f.write(json.dumps(‘传入的字符串‘))

    2.  dump 模式

     with open(‘b.json‘,‘wt‘,encoding=‘utf-8‘) as f :

        json.dump(‘传入的字符串‘ , f)

  # 小练习 : 从网上找一段数据 自己解析一下,

   把数据复制到一个 json文件里面.

      示例:

        with open (‘new.json‘,‘rt‘,encoding=‘utf-8‘) as f:

          res = json.load(f)

          print(res)   # 想要改变格式的话,就用下面这种

          for  dic  in  res[‘第一层的名字‘][‘想要打印出来的名字‘] :

            for key  in  dic:

              print(‘%s:%s‘ %(key, dic[key]))

  4.  XML 模块

    什么是xml:

        是一种标记语言 (计算机能识别的文本)

    xml 有什么用?

        制定了一种文本书写规范,使得计算机能够轻松识别这些数据  就和python一样

    为什么不直接用python语言来进行传输?

        计算机识别起来太费劲(语法太多.变化太复杂)  所以需要一种更加简单的解决方案

    学习的重点还是语法格式

    1. 任何的起始标签都必须有一个结束标签.

       < >  </>

    

    2.可以采用另一种简化语法, 可以在一个标签中同时表示起始和结束标签,

        这种语法是在大于号之前紧跟着一个斜线</>, xml解析器会将其翻译成  <xxx><xxx/>.

     例如 :<百度百科词条/>

    

    3.标签必须按合适的顺序进行 行行嵌套. 所以结束标签必须按镜像顺序匹配

        起始标签, 这好比是将起始和结束标签看作是数学中的左右括号 :在没有关闭所有的

     内部括号之前, 是不能关闭外面的括号的.

    4.所有的特性都必须有值

    5.所有的特性都必须在值的周围加上双引号.

    一个标签的组成部分 :

    <tagename   属性名="属性值">文本内容

    </tagename>

    单标签的写法:

    <tagename  属性名 = "属性值"/>

    镜像关闭的顺序示例:

      <a>

        <b>

          <c>

          </c>

        </b>

      </a>

    把你左右的同学的信息写成xml

      <studentinfo>

        <张三>

          <age>22</age>

          <gender>man</gender>

        </张三>

        <李四>

          <age>23</age>

          <gender>man</gender>

        </李四>

      </studentinfo>

  总结 : xml也是一种中间格式. 也属于序列化方式之一

       与json相比较  :  同样的数据, json 会比 xml 更小,效率更高

        xml 需要根据文档结构 手动解析 而json 直接转对象

  示例:

    import xml.etree.ElementTree as ElementTree

    #  解析xml 文件

    tree = ElementTree.parse(‘d.xml‘)

    print(tree)

    #获取根标签

    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"))

  

    删除子标签

      rootTree.remove(stu)

    添加子标签 (首先要创建一个子标签)

      newTag = ElementTree.Element("这是一个新标签",{"一个属性" : "属性值"})

      rootTree.append(newTag)

    写入文件内

      tree.write(‘f.xml‘ , encoding=‘utf-8‘)

    xml 的练习 (取出文件里的stu下的值.和girlfriend的值)

      import  xml.etree.ElementTree  as  ElementTree

      tree = ElementTree.parse("f.xml")

      

      rootTree = tree.getroot()

      users = [ ]

      for  item in  rootTree.iter(‘stu‘) :

        user = item.attrib

        print(user)

        gitem = item.find(‘girlfrieng‘)

        user[‘girlfriend‘] = gitem.attrib

        users.append(user)

      print(users)

  5.  config parser 模块

    用于解析配置文件的模块

    何为配置文件 ?

    包含配置程序信息的文件就成为配置文件

    什么样的数据应作为配置信息

    需要改,  但是不经常改的信息.  例如数据文件的路径.  DB_PATH

    配置文件中, 只有两种内容

    一种是 section 分区

    一种是 option  选项  (就是一个key = value形式)

    我们用的最多的就是get功能  用来从配置文件获取一个配置选项

    示例:

      import  configparser

      # 创建一个解析器

      config = configparser.ConfigParser()

      

      # 读取并解析 test.cfg

      config.read(‘test.cfg‘,encoding=‘utf-8‘)

      

      #获取需要的信息

      #获取所有分区

      print(config.sections(‘user‘))

      #获取所有选项

      print(config.options(‘user‘))

      #获取某个选项的值

      print(config.get(‘path‘,‘DB_PATH‘))

      # get返回的都是字符串类型  如果需要转换类型  直接使用 get+对应的类型(bool int float)

      print(config.getint(‘user‘,‘age‘)) #返回的是整数类型

      # 是否存在某个选项

      config.has_option(‘想要找的选项‘)

      # 是否存在某个分区

      config.has_section(‘想要找的分区‘)

   不太常用的功能:

      # 添加

      config.add_section(‘想要添加的分区‘)

      config.set(‘server‘,‘url‘,‘192.168.1.2‘)  (添加选项和选项的值, 跟修改是一样的代码)

      # 删除

      config.remove_option(‘user‘,‘age‘) #把user分区下的 age选项给删除了

      # 修改

      config.set(‘server‘,‘url‘,‘192.168.1.2‘) #把url选项的值给改了.

      # 写回文件中

      with open(‘test.cfg‘,‘wt‘,encoding=‘utf-8‘) as f:

        config.write(f)

      # 根据当前平台的默认编码来设定写入的格式. win默认为 GBK.

      

      

      

原文地址:https://www.cnblogs.com/lvyipin1/p/9807288.html

时间: 2024-08-18 07:10:35

学习python课程第十九天的相关文章

学习python课程第十五天

一. 什么是模块? 模块是一组相关功能的集合体,一个模块其实就是一个py文件, python中的一个功能就是一个函数. 例如:mymodule.py 文件名为 mymodule.py 模块名为 mymodule 模块也分为四类: 1,自定义模块 创建一个py文件.把一堆函数写进去就是一个模块. 2.c语言编写并连接到python解释器的内置模块 time模块. time.sleep()功能 等. 内置的模块能不能满足你所有的需求? 不可能. 所以你必然会自己定义模块 这时候就会出现这样一个情况

学习python课程第十六天

一.    包: 1.什么是包: 包就是含有一个__init__.py文件的文件夹,它把所有模块都给组织起来. 强调:在python3中,即使没有__init__.py文件,也不会报错.但是在python2中就会报错. 创建包的目的不是为了运行, 而是被导入使用. 记住, 包只是模块的一种形式而已.包的本质就是一种模块. 2.为何要使用包: 1.包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来. 随着功能越写越多.我们无法将所有功能都放到一个文件中.于是我们使用模块去组织功能, 而

孤荷凌寒自学python第六十九天学习并实践beautifulsoup对象用法2

(完整学习过程屏幕记录视频地址在文末) 今天继续学习beautifulsoup对象的属性与方法等内容. 一.今天进一步了解到的BeautifulSoup模块中的一些用法小结: 1. Html标签对象.parent #返回直接上一级父级对象整体 2. Html标签对象.parents #parents返回从a对象的直接父级对象开始的各个逐个上升的父级直到<html></html>级为止的宗谱链,是一个生成器 3. Html标签对象.next_sibling #获取当前Html标签对象

Linux课程第十九天学习笔记

####################DNS(接上一篇的内容)#################### =====主备DNS=====dns-server    172.25.254.115dns-slave    172.25.254.215 yum install bind -y [[email protected] ~]# firewall-cmd --permanent --add-service=dnssuccess[[email protected] ~]# firewall-cm

python第四十九天--paramiko模块安装大作战

准备开始学习:paramiko模块,发现这个模块十分难搞 安装不上 搞了半天,win10 64下 pytyon 3.6 的 paramiko模块 死活安不上,在网上不断的找资料,可是没有用,没有用啊 无法,用虚拟机搞个centos7,安装,失败,再安装,再失败,上网找资料,终搞定,分享一下经验,免得大家再踩坑. 环境 centos 7 ,自带python 2.7,不用管它 安装新python3 第一步:下载python3.5安装包: wget --no-check-certificate htt

【如何学习Python课程】

一.学习流程方法 1,学习流程方法. 按照视频流程走. 视频稍微有点基础,视频加快速度. 熟悉的同学. 记笔记的形式多 做作业遇到问题记下来,画流程图再写. 二.如何使你的python提高更快 2,如何使你的python提高更快. 调整听说读写顺序. 听.写.读.说 听:加速听 写:1,画流程图:2,写好代码的框架(最小可用原则,调试debug(往产品方向打造): 读:读别人代码和书.先定个小目标(读不下去也得读) 说:给别人讲一遍. 课余练习 1,有意识的和有目的进行练习掌握核心技能. 2,练

学习python课程第二十三天

一.    组合 : 1. 什么是组合 ? 一个对象的属性是来自于另外一个类的对象, 称之为组合. (跟继承其实很相似.都是共用一个类里面的属性) 2. 为何用组合 ? 组合也是用来解决类与类代码冗余的问题. 3. 如何用组合 ? class Foo: aaa=1111 def __init__(self,x,y): self.x=x self.y=y def func1(self): print('Foo内的功能') class Bar: bbb=2222 def __init__(self,

python第五十九天-----补上笔记

rabbitmq_server_topic    topic模式 1 #!/usr/bin/env python 2 #{data} {time} 3 #_*_coding:utf-8_*_ 4 5 import pika,sys,time 6 connection = pika.BlockingConnection(pika.ConnectionParameters( 7 'localhost')) 8 channel = connection.channel()#管道 9 10 11 12

python入门第二十九天-socketserver

简单并发实例 服务端: #!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/8/3 ''' import socketserver class MyServer(socketserver.BaseRequestHandler): #定义自己的类,继承固定的类 socketserver.BaseRequestHandler def handle(self): #方法名 必须用handle 为了重新父类的方法 pri