代码改变世界

python模块序列化--json&pickle&xml

2016-02-28 16:53  qing_add  阅读(828)  评论(0编辑  收藏  举报

参考:http://www.cnblogs.com/alan-babyblog/p/5209717.html

用于序列化的两个模块

  • json,用于字符串 和 python数据类型间进行转换
  • pickle,用于python特有的类型 和 python的数据类型间进行转换

Json模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load

pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load  (不仅可以序列化字典,列表...还可以把一个程序,一个类给序列化掉)

python的具体实现的例子

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import json, pickle
 5 
 6 data = {'k1':123, 'k2':'hello'}
 7 
 8 ## json
 9 # json.dumps 将数据通过特殊的形式转换为所有程序都识别的字符串
10 j_str = json.dumps(data)
11 print(j_str)        #{"k2": "hello", "k1": 123}
12 
13 # json.loads 读取json.dumps特殊处理后的数据并返回该对象
14 j_str_loads = json.loads(j_str)
15 print(j_str_loads)      #{'k2': 'hello', 'k1': 123}
16 
17 # json.dump 将数据通过特殊的形式转换为所有程序都识别的字符串,并写入文件
18 with open('file.json', 'w') as fp:
19     json.dump(data, fp)
20 
21 with open('file.json', 'r') as fp:
22     data_j_load = json.load(fp)
23 print(data_j_load)      #{'k2': 'hello', 'k1': 123}
24 
25 
26 ## pickle
27 # pickle.dumps将数据通过特殊的形式转换成只有python语言能识别的字符串
28 p_str = pickle.dumps(data)
29 print(p_str)       #b'\x80\x03}q\x00(X\x02\x00\x00\x00k2q\x01X\x05\x00\x00\x00helloq\x02X\x02\x00\x00\x00k1q\x03K{u.'
30 
31 # pickle.loads 读取pickle.dumps特殊处理后的数据并返回该对象
32 p_loads = pickle.loads(p_str)
33 print(p_loads)      #{'k2': 'hello', 'k1': 123}
34 
35 # pickle.dump将数据通过特殊的形式转换成只有python语言识别的字符串,并写入文件
36 with open('file.pickle', 'wb') as fp:
37     pickle.dump(data, fp)
38 
39 # pickle.loads 从文件中读取pickle.dumps特殊处理后的数据并返回该对象
40 with open('file.pickle', 'rb') as fp:
41     data_p_load = pickle.load(fp)
42 print(data_p_load)        #{'k2': 'hello', 'k1': 123}

 

xml

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

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

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

 

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

 

xml 的实现代码

 1 #!/usr/bin/env python
 2 '''
 3 xml 格式概述
 4 有根节点、子节点  属性 值得概念  有类似于html的开始和结束
 5 '''
 6 import xml.etree.ElementTree as ET
 7 
 8 tree = ET.parse("xmltest.xml")
 9 root = tree.getroot()
10 print(root.tag)    ###data
11 
12 '''
13 #遍历xml文档
14 for child in root:
15     print(child.tag, child.attrib)
16     for i in child:
17         print("--->",i.tag,i.text)  ###列出子序列的所有数据
18 
19 #只遍历year 节点
20 for node in root.iter('year'):     ###iter 方法 有过滤的意思
21     print(node.tag,node.text)   ##列出年份  node.tag  tag 有标记的意思    node.text  text 有值的意思
22 
23 
24 #修改
25 for node in root.iter('year'):
26     new_year = int(node.text) + 1  ###将node.text int化
27     node.text = str(new_year)
28     node.set("updated","yes")
29 
30 tree.write("xmltest-1.xml")  ###新的内容在年份的位置上就加1了
31 
32 #删除node
33 for country in root.findall('country'):
34    rank = int(country.find('rank').text)
35    if rank > 50:
36      root.remove(country)
37 
38 tree.write('output.xml')      #####结果是把大于50的panma 这个国家下面的内容就删除了
39 '''
40 
41 ###新建 xml
42 new_xml = ET.Element("namelist")
43 name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})   ###enrolled 是注册的意思
44 age = ET.SubElement(name,"age",attrib={"checked":"no"})
45 sex = ET.SubElement(name,"sex")
46 age.text = '33'
47 sex.text = 'female'
48 name2 = ET.SubElement(new_xml,"name2",attrib={"enrolled":"no"})
49 age = ET.SubElement(name2,"age")
50 sex = ET.SubElement(name2,"sex")
51 age.text = '19'
52 sex.text = 'male'
53 et = ET.ElementTree(new_xml) #生成文档对象
54 et.write("test.xml", encoding="utf-8",xml_declaration=True)
55 
56 ET.dump(new_xml) #打印生成的格式
57 
58 
59 #结果会生成如下所示的情况
60 '''
61 <?xml version='1.0' encoding='utf-8'?>
62 <namelist>
63     <name enrolled="yes">
64         <age checked="no">33</age>
65         <sex>female</sex>
66     </name>
67     <name2 enrolled="no">
68         <age>19</age>
69         <sex>male</sex>
70     </name2>
71 </namelist>
72 '''