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

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

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

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

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

# 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)


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 # 若要修改数值 上面需要把writeback修改为Ture 默认不需要添加
s.close()


            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
例子:
1.序列化 dump
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)

2. 反序列化 load
# 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))


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

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

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


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

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

# 镜像关闭顺序实例
<a>
<b>
<c>
</c>
</b>
</a>
例子:
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")


    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)

补充 configparser
import configparser
jie = configparser.ConfigParser()
jie.read('configparser.ini',encoding='utf-8')
# print(jie.sections())
print(jie.options('user1'))
print(jie.get('user1','name1'))
# jie.add_section('user5') # 添加[目录]
jie.set("user3","name3",'jun') #添加/或等于重新修改 [目录下] 的小目录和对面的值
jie.remove_section('user3') # 将[某一个目录] 删除
jie.remove_option('user3','name') # 将[目录选项] 下面的 小选项 删除

with open('configparser.ini','wt',encoding='utf-8') as f:
jie.write(f) # 最后要重新把内存中的数据写入文件覆盖掉




posted on 2018-10-17 20:08  小轩灬  阅读(170)  评论(0编辑  收藏  举报