python3 - 常用模块学习 - 序列化模块 - pickle,json,shelve,xml

目录

序列化基础知识

pickle 模块:处理python所有数据,只能用于python

- pickle序列化

- pickle反序列化

json 模块:处理json模块

- json 序列化

- json 反序列化

shelve 模块:python自带的序列化工具

- shelve 序列化

- shelve 反序列化

- shelve 更新文件数据

xml 模块:实现不同语言或程序数据交换协议的模块

- xml 基本操作

- 创建xml文件 - 方式一

- 创建xml文件 - 方式二


序列化基础知识

'''
序列化 :把对象(变量)从内存中变成可存储或传输的中间格式的过程称之为序列化
        即:python中数据写入文件保存 就是一种序列化过程
    在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等

序列化优点:1:持久保存状态    2:跨平台数据交互
    
注意:把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling       

实现序列化方式 及其优缺点:
    json:
        优点:兼容所有语言,可以跨平台交互数据
        缺点:并不支持所有python类型,只支持常用类型
    
    pickle:
        优点:可以支持所有python数据类型
        缺点:不能跨平台
'''

pickle 模块:处理python所有数据,只能用于python

'''
pickle 模块
        Pickle能将python中所有的数据序列化,但它只能用于Python,并且可能不同版本的Python彼此都不兼容,
    因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。

'''

- pickle序列化

# 序列化
import pickle

dic = {'name': 'alvin', 'age': 23, 'sex': 'male'}
print(type(dic))  # <class 'dict'>
j = pickle.dumps(dic)
print(type(j))  # <class 'bytes'>
f = open('序列化对象_pickle', 'wb')  # 注意是w是写入str,wb是写入bytes,j是'bytes'
f.write(j)  # 等价于pickle.dump(dic,f)
f.close()

- pickle反序列化

# 反序列化
import pickle

f = open('序列化对象_pickle', 'rb')
data = pickle.loads(f.read())  # 等价于data=pickle.load(f)
print(data['age'])

json 模块:处理json模块

'''
json 模块 :用于处理json数据的模块

    json:一种通用的轻量级数据交换格式

          如果要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML(数据大)
        但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,
        也可以方便地存储到磁盘或者通过网络传输。
            且json能支持的数据结构,也就是js支持的数据结构
        JSON不仅是通用的数据交换格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
    
    python和json数据类型的对应关系:

        python - json
        dict - object(对象 {} )
        list,tuple - array (数组 [])
        str - string("" 注:只能双引号)
        int、float - 123.4(number 数字类型)
        Turt、False - true、false
        None - null
    注:json格式,数据类型严格,不支持python的 元组,'',''' '''
    
    json模块常用方法:

        序列化:
            dump:处理文件   dump(数据类型)
            dumps:处理字符串 dumps(数据类型,文件对象)
        反序列化:
            load:处理文件   load(数据类型)
            loads:处理字符串 loads(数据类型,文件对象)
'''

- json 序列化

# 序列化
import json

dic = {'name': 'alvin', 'age': 23, 'sex': 'male'}
print(type(dic))  # <class 'dict'>
j = json.dumps(dic)
print(type(j))  # <class 'str'>
f = open('序列化对象', 'w')
f.write(j)  # 等价于json.dump(dic,f)
f.close()

- json 反序列化

import json

f = open('序列化对象')
data = json.loads(f.read())  # 等价于data=json.load(f)

shelve 模块:python自带的序列化工具

'''
shelve 模块 :一种pthon自带的序列化工具,可自动序列化
            可以直接通过import shelve来引用。
         shelve类似于一个存储持久化对象的持久化字典,即字典文件。使用方法也类似于字典。

        使用方法:
            1.open
            2.读写
            3.close

    注意: shelve 模块只有一个open函数,返回类似字典的对象,可读可写;
            key必须为字符串,而值可以是python所支持的数据类型
'''

- shelve 序列化

# 保存对象至shelve文件中(序列化)
import shelve

db = shelve.open('shelveDict')  # 打开一个文件
db['wangzhe'] = 'wangzhe'  # 向文件中添加内容,添加方式与给字典添加键值对相同
db['lijianguo'] = 'lijianguo'
db.close()  # 关闭文件

- shelve 反序列化

# 从文件中读取对象(反序列化)
import shelve

db = shelve.open('shelveDict')  # 打开文件
a = db.get('wangzhe')
print(db['wangzhe'])  # 向从字典中获取键的方式一样读取内容
print(db['lijianguo'])  # 结果为{'age': 25, 'name': 'lijianguo'}
db.close()  # 关闭文件

- shelve 更新文件数据

# 更新文件中的数据:
import shelve

db = shelve.open('shelveDict')  # 打开文件
wangzhe = db['wangzhe']  # 从文件中读取之前存储的对象
wangzhe['name'] = 'wang zhe'  # 直接对对象进行修改
db['wangzhe'] = wangzhe  # 重新存储至字典文件对象中
print(db['wangzhe'])  # 结果如下{'age': 24, 'name': 'wang zhe'}
db.close()  # 关闭文件

xml 模块:实现不同语言或程序数据交换协议的模块

'''
xml:xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单。

语法:
    一、任何的起始标签都必须有一个结束标签。
    
    二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。
        这种语法是在大于符号之前紧跟一个斜线(/),例如<百度百科词条/>。
        XML解析器会将其翻译成<百度百科词条></百度百科词条>。
        
    三、标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,
        例如<tag1>
                <tag2>
                </tag2>
            </tag1>
        这好比是将起始和结束标签看作是数学中的左右括号:
            在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
            
    四、所有的特性都必须有值。即:特性指的是属性
    
    五、所有的特性都必须在值的周围加上双引号。

使用场景:
    1.配置文件
    2.常规的数据交换

与json的区别:
    xml的优点:
        (1)格式统一
        (2)容易与其他系统进行远程交互,数据共享比较方便
    xml的缺点:
        (1)xml文件庞大,文件格式复杂,传输占带宽
        (2)服务器和客户端都需要花费大量代码来解析xml,导致服务器和客户端代码变得异常复杂且不易维护
        (3)客户端和服务端解析xml花费较多的资源和时间
    json的优点:
        (1)数据格式比较简单,易于读写,格式是压缩的,占用带宽小
        (2)易于解析,包括JavaScript可以通过简单的通过eval_r()进行json数据的读取
    json的缺点:
        (1)没有xml那么通用
        (2)json格式目前还在推广阶段
        
ElmentTree 表示文件的节点树   
Elment 表示一个节点:
    属性:
        1.text : <>text</>
        2.attrib : 所有属性
        3.tag: 标签的名字
    方法:
        get 获取某个属性的值

'''

- xml 基本操作

import xml.etree.ElementTree as et

# 获取节点树
tree = et.parse('TEST.xml')  # 读取xml到内存,的到一个包含所有数据的节点树
print(tree)

# 查找标签
root = tree.getroot()  # 获取根标签
print(root.iter('year'))  # 全文搜索,返回迭代器对象
print(root.find('country'))  # 在root的子节点找,只找一个,且只找第一个
print(root.findall('country'))  # 在root的子节点找,找所有

# 遍历xml文件
for country in root:
    print(country.tag, country.attrib, country.text)
    for t in country:
        print(t.tag, t.attrib, t.text)

# 获取一个属性
print(root.find('country').get('name'))

# 修改xml文件
# 读取到内存
# 并在内存中修改
tree = et.parse('TEST.xml')
for country in tree.findall('country'):
    yeartag = country.find('year')
    yeartag.text = str(int(yeartag.text) + 1)
# 写回文件
tree.write('TEST.xml', encoding='utf-8', xml_declaration=False)

for node in root.iter('year'):
    new_year = int(node.text) + 1
    node.text = str(new_year)
    node.set('updated', 'yes')
    node.set('version', '1.0')
tree.write('test.xml')

# 删除
tree = et.parse('TEST.xml')
root = tree.getroot()
for country in root.findall('country'):
    rank = int(country.find('rank').text)
    if rank > 50:
        root.remove(country)
tree.write('output.xml')

# 增加xml文件
# 在country内添加(append)节点year2
import xml.etree.ElementTree as ET

tree = ET.parse("a.xml")
root = tree.getroot()
for country in root.findall('country'):
    for year in country.findall('year'):
        if int(year.text) > 2000:
            year2 = ET.Element('year2')
            year2.text = '新年'
            year2.attrib = {'update': 'yes'}
            country.append(year2)  # 往country节点下添加子节点
tree.write('a.xml.swap')

- 创建xml文件 - 方式一

# 方法一:
import xml.etree.ElementTree as ET

# 创建根标签
new_xml = ET.Element("namelist")
# 简单创建xml
name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"})
age = ET.SubElement(name, "age", attrib={"checked": "no"})
sex = ET.SubElement(name, "sex")
sex.text = '33'
name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
age = ET.SubElement(name2, "age")
age.text = '19'
# # 写入文件
et = ET.ElementTree(new_xml)  # 生成文档对象
et.write("test1.xml", encoding="utf-8", xml_declaration=True)
ET.dump(new_xml)  # 打印生成的格式

- 创建xml文件 - 方式二

# 方法二:
import xml.etree.ElementTree as ET

new_xml = ET.Element("namelist")
# 创建节点树 et
et = ET.ElementTree(new_xml)  # 生成文档对象
person = ET.Element('person')
person.attrib['name'] = 'test'
person.attrib['sex'] = 'male'
person.attrib['age'] = '18'
person.attrib['text'] = '这是一个person标签'
new_xml.append(person)
# # 写入文件
et.write("test1.xml", encoding="utf-8", xml_declaration=True)
ET.dump(new_xml)  # 打印生成的格式

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/82426889