1. 程式人生 > >第二十天,pickle json xml shelve configparser模組

第二十天,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)