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 可擴展的標記語言
<></>
也是一種通用的數據格式
之所用用它也是由於跨平臺
學習的重點仍是語法格式
1、任何的起始標籤都必須有⼀一個結束標籤。
<> </>
2、能夠採用另外一種簡化語法,能夠在一個標籤中同時表示起始和結束標
籤。這種語法是在⼤於符號以前緊跟一個斜線(/),XML
解析器會將其翻譯成<百度百科詞條></百度百科詞條>。
例例如<百度百科詞條/>。
3、標籤必須按合適的順序進⾏行行嵌套,因此結束標籤必須按鏡像順序匹配
起始標籤。這好⽐比是將起始和結束標籤看做是數學中的左右括號:在沒有關閉全部
的內部括號以前,是不不能關閉外⾯面的括號的。
4、全部的特性都必須有值。
5、全部的特性都必須在值的周圍加上雙引號。
一個標籤的組成部分
<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) # 最後要從新把內存中的數據寫入文件覆蓋掉