pickle、json、xml、shelve、configparser

1.pickle ***
专用于python语言的序列化

"""
    pickle是一个用来序列化的模块
    序列化是什么?
    指的是将内存中的数据结构转化为一种中间格式 并存储到硬盘上

    反序列化?
    将硬盘上存储的中间格式数据在还原为内存中的数据结构

    为什么要序列化?
    就是为了将数据持久存储
    之前学过的文件也能完成持久化存储 但是操作起来非常麻烦

    pickle模块主要功能
    dump
    load
    dumps
    loads
    dump是序列化
    load反序列化
    不带s的是帮你封装write read 更方便

    load函数可以多次执行  每次load 都是往后在读一个对象 如果没有了就抛出异常Ran out of input


"""


import pickle
# 用户注册后得到的数据
name = "高跟"
password = "123"
height = 1.5
hobby = ["吃","喝","赌","飘",{1,2,3}]


# with open("userdb.txt","wt",encoding="utf-8") as f:
#     text = "|".join([name,password,str(height)])
#     f.write(text)

# pickle支持python中所有的数据类型
user = {"name":name,"password":password,"height":height,"hobby":hobby,"test":3}


# 序列化的过程
# with open("userdb.pkl","ab") as f:
#     userbytes = pickle.dumps(user)
#     f.write(userbytes)


# 反序列化过程
# with open("userdb.pkl","rb") as f:
#     userbytes = f.read()
#     user = pickle.loads(userbytes)
#     print(user)
#     print(type(user))
#

#dump 直接序列化到文件
# with open("userdb.pkl","ab") as f:
#     pickle.dump(user,f)

# #load 从文件反序列化
with open("userdb.pkl","rb") as f:
    user = pickle.load(f)
    print(user)
    print(pickle.load(f))
    print(pickle.load(f))
    print(pickle.load(f))




# def myload(filename):
#     with open(filename,"rb") as f:
#         return pickle.load(f)
#

2.json ******
是一种跨平台的数据格式
也属于序列化的一种方式

"""
    pickle 和 shevle 序列化后得到的数据 只有python才能解析
    通常企业开发不可能做一个单机程序 都需要联网进行计算机间的交互
    我们必须保证这个数据 能够跨平台使用


    JSON是什么? java script object notation  就是的对象表示法
    var obj = {"name":"egon"}
    对于我们开发而言 json就是一种通用的数据格式 任何语言都能解析

    js 中的数据类型  python数据类型 的对应关系
    {}              字典
    []              list
    string ""       str
    int/float       int/float
    true/false      True/False
    null            None

    json格式的语法规范
    最外层通常是一个字典或列表
    {} or []
    只要你想写一个json格式的数据 那么最外层直接写{}
    字符串必须是双引号
    你可以在里面套任意多的层次

    json模块的核心功能
    dump
    dumps
    load
    loads
    不带s 封装write 和 read


"""

import json

# 反序列化
# with open("a.json","rt",encoding="utf-8") as f:
#     res = json.loads(f.read())
#     print(type(res))

# with open("a.json",encoding="utf-8") as f:
#     print(json.load(f))


# 直接解析字符串的json为python对象

jsontext = """{
	"users": [{
			"name": "agon",
			"age": 68
		},
		{
			"name": "agon",
			"age": 68
		}
	]
}"""

# res = json.loads(jsontext)
# print(res)


mydic = {
    "users": [{
        "name": "agon",
        "age": 68
    },
        {
            "name": "agon",
            "age": 68
        }
    ]
}
# with open("b.json","wt",encoding="utf-8") as f:
#     f.write(json.dumps(mydic))

# with open("b.json", "wt", encoding="utf-8") as f:
#     json.dump(mydic, f)

import json

# dic = {"a": '理查德姑妈', "b": "找到你", "c": "看不见的客人"}
# with open("c.json","wt",encoding="utf-8") as f:
#     f.write(json.dumps(dic))
# print(repr(s), type(s))

# with open("c.json","rt",encoding="utf-8") as f:
#     # print(f.read())
#     d = json.loads(f.read())
#     print(d)


3.xml *****
可扩展标记语言
一种编写文档的语法 也支持跨平台
比较json而言 属于重量级


"""
    XML 可扩展的标记语言
    <></>
    也是一种通用的数据格式
    之所用用它也是因为跨平台

    学习的重点还是语法格式
    一、任何的起始标签都必须有⼀一个结束标签。
     <> </>
    二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标
    签。这种语法是在⼤于符号之前紧跟一个斜线(/),XML
    解析器会将其翻译成<百度百科词条></百度百科词条>。
    例例如<百度百科词条/>。

    三、标签必须按合适的顺序进⾏行行嵌套,所以结束标签必须按镜像顺序匹配
    起始标签。这好⽐比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有
    的内部括号之前,是不不能关闭外⾯面的括号的。
    四、所有的特性都必须有值。
    五、所有的特性都必须在值的周围加上双引号。


    一个标签的组成部分
    <tagename 属性名称="属性值">文本内容
    </tagname>

    单标签的写法
    <tagename 属性名称="属性值"/>

    # 镜像关闭顺序实例
    <a>
        <b>
            <c>
            </c>
        </b>
    </a>


把你左右同学的信息写成xml
<studentinfo>
    <张三>
        <age>20</age>
        <gender>man</gender>
    </张三>
    <李四>
        <age>20</age>
        <gender>man</gender>
    </李四>
</studentinfo>

    总结 xml也是一种中间格式 也属于序列化方式之一
    与json相比较
    同样的数据  json会比xml 更小 效率更高
    xml 需要根据文档结构 手动解析 而json 直接转对象


"""
import xml.etree.ElementTree as ElementTree
# 解析d.xml
tree = ElementTree.parse("d.xml")
print(tree)
# 获取根标签
rootTree = tree.getroot()

# 三种获取标签的方式
# 获取所有人的年龄 iter是用于在全文范围获取标签
# for item in rootTree.iter("age"):
#     # 一个标签三个组成部分
#     print(item.tag) # 标签名称
#     print(item.attrib) # 标签的属性
#     print(item.text) # 文本内容

# 第二种 从当前标签的子标签中找到一个名称为age的标签  如果有多个 找到的是第一个
# print(rootTree.find("age").attrib)
# 第三种 从当前标签的子标签中找到所有名称为age的标签
# print(rootTree.findall("age"))


# 获取单个属性
stu = rootTree.find("stu")
print(stu.get("age"))
print(stu.get("name"))

# 删除子标签
rootTree.remove(stu)


# 添加子标签
# 要先创建一个子标签
newTag = ElementTree.Element("这是新标签",{"一个属性":"值"})
rootTree.append(newTag)

# 写入文件
tree.write("f.xml",encoding="utf-8")










4.shelve ***
极其简单的序列化模块 只用于python


# 内存 - > 内置 -> sys.path

"""
    shelve模块 也用于序列化
    它于pickle不同之处在于  不需要关心文件模式什么的 直接把它当成一个字典来看待
    它可以直接对数据进行修改 而不用覆盖原来的数据
    而pickle 你想要修改只能 用wb模式来覆盖

"""

import shelve
# user = {"name":"高根"}
# s = shelve.open("userdb.shv")
# s["user"] = user
# s.close()


s = shelve.open("userdb.shv",writeback=True)
print(s["user"])
s["user"]["age"] = 20
s.close()

5.configparser *****
配置文件解析模块

"""
    config  parser
    用于解析配置文件的模块
    何为配置文件
    包含配置程序信息的文件就称为配置文件
    什么样的数据应作为配置信息
    需要改  但是不经常改的信息  例如数据文件的路径 DB_PATH

    配置文件中 只有两种内容
    一种是section 分区
    一种是option  选项 就是一个key=value形式

    我们用的最多的就是get功能 用来从配置文件获取一个配置选项

    练习:
    做一个登录 首先查看配置文件 是否又包含 用户名和密码 如果由直接登录 如果没有就进行输入用户名密码登录
    登录成功后 询问是否要保存密码  如果是 写入配置文件

"""
import configparser
# 创建一个解析器
config = configparser.ConfigParser()
# 读取并解析test.cfg
config.read("test.cfg",encoding="utf-8")
# 获取需要的信息
# 获取所有分区
# print(config.sections())
# 获取所有选项
# print(config.options("user"))
# 获取某个选项的值
# print(config.get("path","DB_PATH"))
# print(type(config.get("user","age")))
#
# # get返回的都是字符串类型  如果需要转换类型 直接使用get+对应的类型(bool int float)
# print(type(config.getint("user","age")))
# print(type(config.get("user","age")))

# 是否由某个选项
config.has_option()
# 是否由某个分区
# config.has_section()

# 不太常用的
# 添加
# config.add_section("server")
# config.set("server","url","192.168.1.2")
# 删除
# config.remove_option("user","age")
# 修改
# config.set("server","url","192.168.1.2")

# 写回文件中
# with open("test.cfg", "wt", encoding="utf-8") as f:
#     config.write(f)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值