一、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

转载于:https://www.cnblogs.com/jianguo221/p/9006879.html

python模块--json \ pickle \ shelve \ XML模块相关推荐

  1. 常用模块(json/pickle/shelve/XML)

    一.json模块(重点) 一种跨平台的数据格式 也属于序列化的一种方式 介绍模块之前,三个问题: 序列化是什么? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化. 反序列化又是什么? 将 ...

  2. Python(序列化json,pickle,shelve)

    序列化 参考:https://www.cnblogs.com/yuanchenqi/articles/5732581.html 1 # dic = str({'1':'111'}) 2 # 3 # f ...

  3. json,pickle,shelve序列化和反序列化

    1.简介 ●  json:用于字符串 和 python简单数据类型(list,dict...)间进行转换:字符串<--->python简单数据类型 ●  pickle:用于python特有 ...

  4. 第五周-第11章节-Python3.5-内置模块详解之Xml模块

    Python XML操作 XML(可扩展性标记语言)是一种非常常用的文件类型,主要用于存储和传输数据.在编程中,对XML的操作也非常常见. 本文根据python库文档中的xml.etree.Eleme ...

  5. python批量json文件转xml文件脚本(附代码)

    场景:在使用了mask rcnn跑实验后标注了大量地json格式文件,现在打算使用yolo和faster rcnn 跑实验 所以需要将之前地json文件转为xml     但是找了很久,没发现有批量处 ...

  6. python-22 eval json pickle shelve 之间差别

    1.eval:可以转化字符串,字典,元组,列表等一般类型,不能转化类,函数 2.json:可以转化一般类型外,还可转化函数,可以在任何语言间转化,转化为字符串,可以写入文本,故这个较常用.      ...

  7. shelve 序列化模块——day18

    # shelve 模块 # 用于序列化的模块 # json,pickle import shelve # s = shelve.open("test.she") # s[" ...

  8. python中常用的序列化模块_第六章 常用模块(5):python常用模块(序列化模块:pickle,json,shelve,xml)...

    6.3.7 序列化模块 (pickle,json,shelve,xml) 文件写入,数据传输时,我们都是以字符串形式写入的(因为字符串可以encode成bytes). 那其他类型(比如字典,列表等)想 ...

  9. python常用模块:pickle、shelve、json、xml、configparser

    今日内容主要有: 一.pickle模块 二.shelve模块 三.json模块 四.json练习 五.xml模块 六.xml练习 七.configparser模块 一.pickle模块 #pickle ...

最新文章

  1. mysql集群不同步_mysql数据库集群出现1236错误导致主库与从库无法同步的
  2. Python编写简易木马程序
  3. GraphQL一些hello world级别的例子
  4. a的n次方的最后三位数c语言,求13的n次方(12n≤130000000000)的最后三位数,用c++编程...
  5. OpenCV中Kinect的使用(3)
  6. vbox设置剪切板共享
  7. 机器学习之BP算法推导
  8. React中实现防抖功能的两种方式
  9. 冶金物理化学复习 --- 熔渣的基础理论
  10. Jack Platts:Polkadot 在 Staking 上的设计
  11. html5的canvas实现中国象棋
  12. 1625:Sequence Median(翻译)
  13. 关于向数据库中插入数据时报“An explicit value for the identity column in table can only be specified when ...“的错误
  14. 帅初的“罗生门”漩涡
  15. 编程序也得劳逸结合,不能太累。。。
  16. Appium-Get Handles(获取句柄/多)
  17. 教你如何搭建vue项目
  18. 元器选型攻略之 电感
  19. 云原生周报 | Fluent Bit下载量达到10亿次;对 Istio 1.11的支持已经结束
  20. 深度学习-TextCNN网络(简单了解TextCNN网络构建过程)

热门文章

  1. Powershell管理系列(十一)Exchange完全访问权限邮箱的设置
  2. [Android学习笔记]LinearLayout布局,剩余空间的使用
  3. oracle clob
  4. 关于SQL操作的一些经验
  5. (转)各种纹理贴图技术
  6. [待解决]报错的脚本
  7. quant companies
  8. PPT科研绘图之棱台
  9. !和?在formal method里面的意思
  10. 强弩之末,势不能穿鲁缟