zoukankan      html  css  js  c++  java
  • python模块--json pickle shelve XML模块

    一、json模块

    之前学习过的eval内置方法可以将一个字符串转成一个python对象,不过eval方法时有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了。所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值。

    1 import json
    2 x = "[null,true,false,1]"
    3 # print(eval(x))   #用eval会报错
    4 print(json.loads(x))  # 用json就不会报错
    View Code

    什么是序列化?

    我们把对象(变量)从内存种变成可存储或传输的过程称之为序列化,在python种叫picking,在其他语言种也被称之为serialiation,marshalling,flattening,等等,都是一个意思。序列化之后,就可以把徐磊话后的内容写入磁盘,或者通过网络传输到机器上。反过来,把变量内容从徐磊话的对象重新督导内存里称之为反序列化,即unpicking.
    json

    如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准式,比如XML,但更好的方法是序列化为json,因为json表示出来就是一个字符串,可以被所有语言读取。也可以方便的存储到磁盘或者通过网络传输。json不仅是标准式,并且比XML更快,而且可以直接在web页面种读取,非常方便。

     1 json表示的对象就是标准的JavaScript语言的对象,json和python内置的书v类型如下:
     2 
     3 JSON                              PYTHON类型
     4 {}                                 dict
     5 []                                 list
     6 "string"                           str
     7 1234.56                            int或float
     8 true/false                         Ture/False
     9 null                               None                                        

    json的内部转成

    1 dic={'name':'alex'}#---->{"name":"alex"}----->'{"name":"alex"}'
    2 i=8                 #---->'8'
    3 s='hello'          #---->"hello"------>'"hello"'
    4 l=[11,22]           #---->"[11,22]"

    例1:json和eval的区别

    1 import json
    2 x = "[null,true,false,1]"
    3 # print(eval(x))   #用eval会报错
    4 print(json.loads(x))  # 用json就不会报错,即eval有局限性

    例2:不用json时的读写文件方式

     1 dic = '{"name":"老王","age":18}'
     2 f = open("hello","w",encoding="utf-8")
     3 f.write(dic)
     4 f.close()      #  注意,写完文件后要记得关闭文件
     5 f_read = open("hello","r",encoding="utf-8")
     6 data = f_read.read()
     7 # print(data)
     8 print(type(data))
     9 dat = eval(data)
    10 print(dat)
    11 print(dat["name"])

    例3:运用json时的读写方式

     1 import json
     2 dic = {'name':'老王','age':19}
     3 f = open("new_hello","w",encoding="utf-8")
     4 dic_str = json.dumps(dic)     #将字典编译成json格式的字符串,因为json格式的可以进行多种数据传输。即序列化的过程
     5 f.write(dic_str)     #写入文件,最后存在文件中的形式都是字符串格式的,已经不是字典了。
     6 f.close()
     7 #json.dump(dic,f)    #该句相当于以上两句的效果,平时用上面的比较好。
     8 
     9 f_read = open("new_hello","r",encoding="utf-8")
    10 data = json.loads(f_read.read())       #进行反序列化,将json格式的字符串转成普通的字符串
    11 #data = json.load(f_read)  #该句相当于以上一句。可以简单化,但是平时用上面的比较多。
    12 print(data)
    13 print(type(data))     #由此可见,反序列化后,又转成了字典形式。
    14 print(data["name"])   #由上一部可以得知,这里可以进行由键取值
    1 {'name': '老王', 'age': 19}
    2 <class 'dict'>
    3 老王

    例4:注意一些细节

    1 import json
    2 with open("new_hello1","r")  as  f:  #这种读取方式可以命名,如别名 "f",也要有打开方式
    3     data = f.read()
    4     data = json.loads(data)
    5     print(data["name"])

    二,pickle模块

    pickle
    pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于python,并且可能不同版本的python彼此都不兼容,因此,只能用pickle保存那些不重要的数据,不能成功
    地反序列化也没关系

    例:pickle的序列化与反序列化的过程

     1 dic = {"name":"老王","age":18,"gender":"male"}
     2 import pickle
     3 print(type(dic))  #<class 'dict'>
     4 
     5 j = pickle.dumps(dic)
     6 print(type(j))        #<class 'bytes'>
     7 
     8 f = open("序列化_str","wb")  #"w"是写入str; "wb"是写入bytes.注意这个细节
     9 f.write(j)
    10 f.close()
    11 #j = picklr.dumps(dic)  和f.write(j)  这两句等价于  pickle.dump(f)
    12 ####----->  以上pickle.dumps() 的过程就相当于   【序列化】  的过程
    13 
    14 ####----->  以下pickle.loads()  就是反序列化的过程
    15 f_read = open("序列化_str","rb")
    16 data = pickle.loads(f_read.read())  #相当于  data = pickle.load(f.read)
    17 print(data["name"])
    18 print(data["age"])
    1 <class 'dict'>
    2 <class 'bytes'>
    3 老王
    4 18

    三,shelve模块

    shelve
    shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类。

     1 import shelve
     2 f = shelve.open(r"shelve1.txt")   # 此处是将一个字典放入文本 f = {}
     3 f['info1'] = {"name":"老王","age":18,"gender":"male"}
     4 f['info2'] = {"name":"老李","age":20,"gender":"male"}
     5 f['school_info'] = {'website':'www.baidu.com','city':'beijing'}
     6 ##--------->  以上这些是写入内容
     7 f.close()
     8 ####运行会生成三个文件
     9 f = shelve.open(r"shelve1.txt")
    10 print(f.get('info1')['name'])           #读取方法用f.get,读取前要打开文件。打开方式如上

    四、XML

    XML模块
    xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没有诞生的的年代里,大家只能选择用xml,至今很多传统公司如金融行业的很多系统的接口还主要是xml.

    xml的格式如下,就是通过<>节点来区别数据结构的:

    数据代码如下

     1 <data>
     2     <country name="Liechtenstein">
     3         <rank updated="yes">2</rank>
     4         <year updated="yes">2010</year>
     5         <gdppc>141100</gdppc>
     6         <neighbor direction="E" name="Austria" />
     7         <neighbor direction="W" name="Switzerland" />
     8     </country>
     9     <country name="Singapore">
    10         <rank updated="yes">5</rank>
    11         <year updated="yes">2013</year>
    12         <gdppc>59900</gdppc>
    13         <neighbor direction="N" name="Malaysia" />
    14     </country>
    15     <country name="Panama">
    16         <rank updated="yes">69</rank>
    17         <year updated="yes">2013</year>
    18         <gdppc>13600</gdppc>
    19         <neighbor direction="W" name="Costa Rica" />
    20         <neighbor direction="E" name="Colombia" />
    21     </country>
    22 </data>
    View Code

    注释:属性用来解释标签;属性加在标签的第一个<>里面;xml都是tag属性。

    xml协议在各个语言里都是支持的,在python中可以用以下模块操作xml:

     1 #####--------------------------> XML
     2 import  xml.etree.ElementTree as ET   # 原名太长,可以起别名,方便下面引用
     3 
     4 tree = ET.parse('xml_lesson1')   #??
     5 root = tree.getroot()       #??
     6 print(root.tag)     #打印根节点
     7 
     8 for i in root:
     9     # print(i.tag)   #打印data下的第一层节点,即三个country
    10     # print(i.attrib)     # 打印每个节点的属性,即country,<>内部紧跟country的部分
    11     for j in i:
    12         # print(j.tag)    #打印data下的第二层节点,即country下的节点,
    13         # print(j.attrib)  # 打印该层每个节点的属性
    14         print(j.text)     #打印 每两个<>之间包括的值
    15 
    16 ##------->  遍历xml文档
    17 
    18 for child in root:
    19     print(child.tag,child.attrib)
    20     for n in child:
    21         print(n.tag,n.text)
    22 
    23 ##------> 只遍历year节点
    24 for code in root.iter('year'):
    25     print(code.tag,code.text)
    26 
    27 
    28 ###------------->  修改
    29 import  xml.etree.ElementTree as ET   # 原名太长,可以起别名,方便下面引用
    30 
    31 tree = ET.parse('xml_lesson1')
    32 root = tree.getroot()
    33 
    34 ###------------->  修改
    35 for code in root.iter('year'):
    36     new_year = int(code.text) + 1
    37     code.text = str(new_year)
    38     code.set("updated","yes")
    39 tree.write('xml_lesson')
    40 
    41 ##--------------> 删除节点
    42 for node in root.findall('country'):
    43     rank = int(node.find('rank').text)
    44     if rank > 5:
    45         root.remove(node)
    46 tree.write('output.xml')
    View Code
    1 import  xml.etree.ElementTree as ET   # 原名太长,可以起别名,方便下面引用
    2 
    3 tree = ET.parse('xml_lesson1')   #解析xml,读取数据,摄取数据赋给变量tree,tree即成对象,
    4                                    # 且是一个实体对象,可以调用一系类方法
    5         #'xml_lesson1 里面存的都是文档树
    6         #data是根对象,下面的country都是节点对象
    7 root = tree.getroot()       #获取tree的根节点
    8 print(root.tag)     #打印根节点

    自己创建xml文档

     1 ####--------------------------> 自己创建标签语言
     2 import xml.etree.ElementTree as ET
     3 new_xml = ET.Element('namelist')
     4 name = ET.SubElement(new_xml,'name',attrib={'enrolled':'yes'})
     5 age = ET.SubElement(name,'age',attrib={'checked':'no'})
     6 sex = ET.SubElement(name, "sex")
     7 sex.text = '33'
     8 name2 = ET.SubElement(new_xml, 'name', attrib={"enrolled": "no"})
     9 age = ET.SubElement(name2, 'age')
    10 age.text = '19'
    11 
    12 et = ET.ElementTree('newx_xml')  #生成文档对象
    13 et.write('test.xml',encoding='utf-8',xml_declaration=True)
    14 #ET.dump(new_xml)  # 打印生成的格式
    View Code
  • 相关阅读:
    转:手册网(程序员开发手册相关网站)
    转:关于视频H264编解码的应用实现
    转:视频压缩的基本概念(x264解压包)
    转:MediaCoder H.264格式编码参数设置及详解
    转: 移动直播技术秒开优化经验
    关于阿里 weex 的使用与案例
    转:视频流服务架构解析(音视频格式介绍)
    转:移动端即时通讯系统实践
    转:GRADLE构建最佳实践
    转: Syslog协议介绍
  • 原文地址:https://www.cnblogs.com/jianguo221/p/9006879.html
Copyright © 2011-2022 走看看