第二十天,pickle json xml shelve configparser模組
今日內容
1.pcikle
專用於python語言的序列化
2.json
是一種跨平臺的資料格式
也屬於序列化的一種方式
3.xml
可拓展標記語言
一種編寫文件的語法 也支援跨平臺
比較json而言 屬於重量級
4.shelve
及其簡單的序列化模組 只用於python
5 confiqparser
配置檔案解析模組
一 pickle
pickle是一個用來序列化的模組
序列化是什麼?
指的是將記憶體中的資料結構轉化為一種中間格式 並存儲到硬碟上
反序列化是什麼?
將硬碟上儲存的中間格式資料再還原為記憶體中的資料結構
為什麼要學序列化?
就是為了將資料持久儲存
之前學過的檔案也能完成持久化儲存 但是操作起來非常麻煩
pickle模組主要功能
dump 序列化
load 反序列化
dumps
loads
不帶s得死幫你封裝write read 更方便
load函式可以多次執行 每次load 都是往後再讀一個物件 如果沒有了就丟擲異常Ran out of input
import pickle #使用者註冊後得到的資料 name = '高跟‘’ password = ‘123’ height= 1.5 hobby = ['吃‘,‘喝’,‘賭’,‘飄’,{1,2,3}】
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))
二 shelve模組
shelve 模組 也用於序列化
它於pickle 不同之處在於 不需要關心檔案模式什麼的 直接把它當成一個字典來看待
它可以直接對資料進行修改 而不用覆蓋原來的資料
而pickle 你想要修改只能 用wb模式來覆蓋
import shelve use = {'name':'高根‘} s = shelve.open('userdb.shv') s['user'] = user s.close() s = shelve.open('userdb.shv',writeback=True) print(s['user']) s['user']['user']) s['user']['age']=20 s.close()
三 jison模組(******)
pickle 和 shevle 序列化後得到的資料 只有Python才能解析
通常企業開發不可能做一個單機程式 都需要聯網進行計算機間的互動
我們必須保證這個資料 能夠跨平臺使用
JSON是什麼? jave script object notation 就是的物件表示法
var obj = {"name":"egon")
對於我們開發而言 json 就是一種通用的資料格式 任何語言都能解析
js中的資料型別 Python資料型別
{} 字典
[] list
string"" str""or''
int/float int/float
true/false True/False
null None
json格式的語法規範
最外層通常是一個字典或者列表
{ }或[ ]
只要你想寫一個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)
練習
把news.json中的新聞資料 提取出來列印控制檯
import json with open("news.json","rt",encoding="utf-8") as f: res = json.load(f) print(type(res)) for dic in res["result"]["data"]: for key in dic: print("%s:%s" % (key, dic[key]))
四 XML
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")
五 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)