2018.10.17学习总结

"""
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 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()

3json的介绍和pickle,shevle对比
"""
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


"""
mport 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))#repr把任意字符串转化为解释器可以理解的形式

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

4 """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)#删除内存里的数据
stu = rootTree.find("stu")#再获取一次获得其他同级别的属性
print(stu.get("name"))


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

# 写入文件
获取子标签下面的标签要iter循环进行获取
tree.write("f.xml",encoding="utf-8")
import xml.etree.ElementTree as ElementTree
tree = ElementTree.parse("f.xml")
rootTree = tree.getroot()
users = []
for item in rootTree.iter("stu"):
user = item.attrib
print(user)
gitem = item.find("girlfriend")
user["girlfriend"] = gitem.attrib
users.append(user)
print(users)

""
5 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()#输入分区和选项比如usr,name返回bool
# 是否由某个分区
# config.has_section()#输入分区返回bool

# 不太常用的
# 添加
# 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)

原文地址:https://www.cnblogs.com/jutao/p/9863494.html