1. 程式人生 > >python學習的第21天模塊之pickle、json、xml、shelve、configparser

python學習的第21天模塊之pickle、json、xml、shelve、configparser

簡化 我們 計算機 pri 區別 type 簽名 pass 企業

一、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天模塊之pickle、json、xml、shelve、configparser