python模块--json pickle shelve XML模块
Posted 遥望那月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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就不会报错
什么是序列化?
我们把对象(变量)从内存种变成可存储或传输的过程称之为序列化,在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>
注释:属性用来解释标签;属性加在标签的第一个<>里面;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‘)
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) # 打印生成的格式
以上是关于python模块--json pickle shelve XML模块的主要内容,如果未能解决你的问题,请参考以下文章