python学习的第21天模块之picklejsonxmlshelveconfigparser
Posted yehuihuihui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习的第21天模块之picklejsonxmlshelveconfigparser相关的知识,希望对你有一定的参考价值。
一、pickle ***
1、作用;专门用于python语言的序列化
PS;(1)什么是序列化?
指的是将内存中的数据结构转化为一种中间格式,并存储到硬盘上
(2)什么是反序列化?
将硬盘上存储的中间格式数据在还原为内存中的数据结构
(3)为什么要序列化?
为了将数据持久存储,之前学过的文件也能完成持久化储存,但是操作起来非常麻烦
Pickle模块主要功能:dump、load、dunmps、loads
dump是序列化,load是反序列化
注意:
dump和dumps、load和loads的区别:不带s 是帮你封装write和read更方便
load函数可以多次执行 每次load 都是往后在读一个对象 如果没有了就抛出异常Ran out of input
先创建一个文件,用户注册后得到的数据
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))
#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))
二、shelve
1、作用:极其简单的序列化模块,只用于python
优点:shelve模块 也用于序列化,它于pickle不同之处在于 不需要关心文件模式什么的 直接把它当成一个字典来看待,
它可以直接对数据进行修改 而不用覆盖原来的数据,而pickle 你想要修改只能 用wb模式来覆盖
shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型
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()
三、json *****
1、作用是一种跨平台的数据格式 也属于序列化的一种方式
2、为什么用:
pickle 和 shevle 序列化后得到的数据 只有python才能解析
通常企业开发不可能做一个单机程序 都需要联网进行计算机间的交互
我们必须保证这个数据 能够跨平台使用
js 中的数据类型 python数据类型 的对应关系 {} 字典 [] list string "" str int/float int/float true/false True/False null None
3、怎么用:
json格式的语法规范
最外层通常是一个字典或列表{} or []
只要你想写一个json格式的数据 那么最外层直接写{},且字符串必须是双引号
你可以在里面套任意多的层次
对于我们开发而言 json就是一种通用的数据格式 任何语言都能解析
json存储数据取必须都是python数据结构 js 中的数据类型 python数据类型 的对应关系 {} 字典 [] list string "" str int/float int/float true/false True/False null None
json模块的核心功能
dump、dumps、load、loads 不带s 封装write 和 read
(1)json的序列化
import json dic={‘name‘:‘egon‘,‘age‘:18,‘sex‘:‘male‘} #序列化:内存中的数据类型------>中间格式json # # 1、序列化得到json_str # json_str=json.dumps(dic) # # 2、把json_str写入文件 # with open(‘db.json‘,‘wt‘,encoding=‘utf-8‘) as f: # f.write(json_str) #1和2合为一步 with open(‘db.json‘,‘wt‘,encoding=‘utf-8‘) as f: json.dump(dic,f) # print(json_str,type(json_str)) # json格式不能识别单引号,全都是双引号
(2)json的反序列化
import json #反序列化:中间格式json-----》内存中的数据类型 # #1、从文件中读取json_str # with open(‘db.json‘,‘rt‘,encoding=‘utf-8‘) as f: # json_str=f.read() # #2、将json_str转成内存中的数据类型 # dic=json.loads(json_str) #1和2可以合作一步 with open(‘db.json‘,‘rt‘,encoding=‘utf-8‘) as f: dic=json.load(f) print(dic[‘sex‘])
四、xml
1、作用:可扩展标记语言,一种编写文档的语法 也支持跨平台,比较json而言 属于重量级(不实用)
import xml.etree.ElementTree as ET tree = ET.parse("a.xml") root = tree.getroot()
学习的重点还是语法格式
(一)、任何的起始标签都必须有?一个结束标签。
<> </>
(二)、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标
签。这种语法是在?于符号之前紧跟一个斜线(/),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")
五、configparser *****
1、作用:用于解析配置文件的模块
何为配置文件:包含配置程序信息的文件就称为配置文件
什么样的数据应作为配置信息:需要改 但是不经常改的信息 例如数据文件的路径 DB_PATH
2、用法:
配置文件中 只有两种内容
一种是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)
以上是关于python学习的第21天模块之picklejsonxmlshelveconfigparser的主要内容,如果未能解决你的问题,请参考以下文章
21天学习挑战赛Python学习第四篇:多线程 threading 模块
21天学习挑战赛Python学习第四篇:多线程 threading 模块
21天学习python编程_ini文件与ConfigParser模块
21天学习python编程_pickle模块序列化与反序列化