1. 程式人生 > >json pickle xml shelve configparser

json pickle xml shelve configparser

5.json
# 是一種跨平臺的資料格式
也屬於序列化的一種方式
pickle和shevle 序列化後得到的資料 只有python才可以解析
通常企業開發不可能做一個單機程式 都需要聯網進行計算機間的互動

JSON是什麼?java script object notation 就是物件的表示法
var obj={"name":"egon"}
對於我們開發而言 json就是v一種通用的資料格式 任何語言都能解析
js 中的資料型別 python中的資料型別
{} 字典
[] list
string "" str
int/float int/float

json格式的語法規範
最外層必須是一個字典或列表
{}or[]
只要你想寫一個json格式的資料 那麼最外層常用字典{}
字串必須用“”來表示
你可以在裡面套用任意多的層次


舉例:
反序列化
loads:
import json
with open("a.json","rt",encoding="utf-8")as f:
res=json.loads(f.read())
print(res)

load:
with open("a.json","rt",encoding="utf-8")as f:
print(json.load(f))

直接解析字串的json為python個格式
jsontext="{"name":"egon"}"
res=json.loads(jsontext)
print(res)

mydic={"name":"egon"}
with open("b.json","wt",encoding="utf-8")
f.write(json.dunps(mydic))

with open("b.json","wt",encoding="utf-8")
json.dunp(mydic, f))










6.pickle(一個用來序列化的模組)
# 專用與python語言的序列化
市場python中所有的資料格式
序列化:將記憶體中的資料結構轉化為一種中間格式 並存儲到硬碟
反序列:將硬碟上儲存的中間格式資料在還原為記憶體中的資料結構
為什麼要序列化:就是為了將資料持久儲存
之前學過的檔案也可以完成持久化儲存 但是操作起來非常麻煩

pickle模組的主要功能:
dump:序列化
load:反序列化
不帶s的是幫你封裝write read 更方便
load函式可以多次執行 每次load 都是往後再讀一個物件 如果沒
有了就丟擲異常

舉例:
序列化過程:
user={xx:xxx,xx:xxx...}
with open('uu.txt','wb')as f:
user=pickle.dumps(user)
f.write(user)

反序列過程:
with open('uu.txt','rb')as f:
user_dic=f.read()
user=pickle.loads(user_dic)
print(user)

dump使用(直接序列化到檔案)
with open('xx.txt','wb')as f:
pickle.dump(user,f)

load從檔案反序列化
with open('xx.txt','wb')as f:
user=pickle.load(f)
print(user)












7.xml(# 可擴充套件的標記語言)一種編寫文件的語法 也支援跨平臺
<></>
也是一種通用的資料格式
之所以用它也是因為跨平臺
比較json而言 屬於重量級
xml語法標準:
1.任何的起始標籤都必須有一個結束標籤
2.可以採用另一種簡化語法,可以在一個標籤中同時表示起始和結束標籤.
這種語法實在大於符號之前緊跟一個斜線(/),例如<百度百科/> ,xml解
釋器會將其翻譯成<百度百科></百度百科>
3.標籤必須按照合適的孫旭進行巢狀,所以結束標籤必須按映象順序匹配
起始標籤.這好比是將起始和結束標籤看作是數學中的左右括號:在沒有
關閉所有的內部括號之前,是不能關閉外面的括號的.
4.所有的特性都必須有值
5.所有的特性都必須在值的周圍加上雙引號

一個標籤的組成部分;
<tagename 屬性名稱="屬性值">文字內容
</tagename>
單標籤的寫法:
<tagename 屬性名稱="屬性值">

映象關閉順序例項:
<a>
<b>
<name>man</name>
</b>
</a>


解析一個xml例項:
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.finddall("age"))

# 獲取單個屬性
stu=rootTree.find("stu")#找尋到標籤stu
print(stu.get("age"))#列印標籤stu中的age的屬性值

# 刪除子標籤
rootTree.remove(stu)#刪除標籤stu

#新增子標籤
#首先要先建立一個子標籤
newTag=ElementTree.Element("這是新的標籤",{"一個屬性":"值"})
rootTree.append(newTag)

# 寫入檔案
tree.write("f.xml",encoding='utf-8')

#取子標籤中的屬性值
rootTree=tree.getroot()
users=[]
for item in rootTree.iter("stu"):
user=item.attrib
print(user)
gitem=item.find("girlfriend")
user["girlfriend"]=gitem.attrib
users.append(user)
print(users)












8.shelve
# 極其簡單的序列化模組 只用於python
它用於序列化 不需要關心檔案模式什麼的 直接把它當成一個字典來看待
它可以直接對資料進行修改 而不用覆蓋原來的資料
而pickle 你想要修改只能 用wb模式來覆蓋
import shelve
user={xx:xxx}
s=shelve.oopen('userdb.shv')
s['user']=user
s.close()

反序列取
s=sheelve.open('userdb.shv')
print(s['user'])
s.close()

取的時候修改
s=sheelve.open('userdb.shv',writeback=True)
print(s['user'])
s['user']['age']=20
s.close()


9.configparser(.cfg格式)
配置檔案解析模組
config parser
用於解析配置檔案的模組
何為配置檔案:
包含配置程式資訊的檔案就懲治為配置檔案
什麼樣的資料應該作為配置資訊
需要改 但是不經常改 例如資料檔案的路徑 DB_PATH
配置檔案中 只有兩種內容
一種是section 分割槽
一種是option 選項 就是一個key=value形式
我們用的最多的就是get功能 用來從配置檔案獲取一個配置選項

#判斷是否有某個選項:
config.has_option()
#是否有某個分割槽:
config.has_section()

舉例aa.cfg下
[path]
DB_PATH=C://myfile/test.txt
[user]
name = 高根
age = 20

import configparser
#建立一個直譯器
config=configparser.ConfigParser()
#讀取並解析aa.cfg
config.read(aa.cfg,encouding="utf-8")
#獲取需要的資訊
#獲取所有分割槽
print(config.sections())
#獲取所有選項
print(config.options("user"))
#獲取某個選項的值(預設是字串)
#getint getfloat getbool(可以直接轉換型別)
print(config.get("path","DN_PATH"))

不太常用的
1.新增
config.add_section("server")
2.刪除
config.remove_option("user","age")
3.修改
config.set("server","url","192.168.1.1")
寫回檔案中
with open("aa.cfg","wt",encoding="utf_8")as f:
config.write(f)