1. 程式人生 > >python D22 序列化

python D22 序列化

ascii back 操作 ise 反序 產生 ict reg ==

# 常用模塊-02
# 序列化 把對象打散成二進制字節 bytes
# 1. pickle 把一個對象轉化成bytes寫入到文件
# pickle.dumps() 把對象轉換成bytes
# pickle.loads() 把bytes轉化成對象
#
# pickle.dump() 把對象轉換成bytes. 寫入到文件
# pickle.load() 把文件中的bytes讀取. 轉化成對象
#
# 2. shelve 小型數據庫, redis, mongodb, dict
# 當成字典來用
# writeback=True
#
# 3. json 以前用xml 先在用json
# json.dumps() 把字典轉換成json字符串
# json.loads() 把json字符串轉化成字典
#
# json.dump() 把字典轉換成json字符串. 寫入到文件
# json.load() 把文件中的json字符串讀取. 轉化成字典
#
# default = 把對象轉化成字典. 需要自己寫轉換過程
# object_hook = 把字典轉化成對象. 需要自己寫轉換過程
#
# ensure_ascii = False 可以處理中文

# 4. configparser 處理windows配置文件的 dict

# 一、什麽是序列化
# 在我們存儲數據或者?絡傳輸數據的時候. 需要對我們的對象進?處理. 把對象處理成
# ?便存儲和傳輸的數據格式. 這個過程叫序列化. 不同的序列化, 結果也不同. 但是?的是?
# 樣的. 都是為了存儲和傳輸.

# 在python中存在三種序列化的?案.
# 1. pickle. 可以將我們python中的任意數據類型轉化成bytes並寫入到?件中. 同樣也
# 可以把?件中寫好的bytes轉換回我們python的數據. 這個過程被稱為反序列化
# 2. shelve. 簡單另類的?種序列化的?案. 有點?類似後?我們學到的redis. 可以作為
# ?種?型的數據庫來使?
# 3. json. 將python中常?的字典, 列表轉化成字符串. 是?前前後端數據交互使?頻率
# 最?的?種數據格式.

# 二、pickle
# 單獨一個對象不涉及到文件寫入用dumps和loads,涉及到對象寫入文件用dump/load
# pickle?起來很簡單. 說?了. 就是把我們的python對象寫入到?
# import pickle
# class Cat:
# def __init__(self, name, age):
# self.name = name
# self.age = age
# def catchMouse(self):
# print(self.name, "抓??")
# c = Cat("jerry", 18)
# bs = pickle.dumps(c) # 序列化?個對象.
# print(bs) # ?堆?進制. 看不懂
# cc = pickle.loads(bs) # 把?進制反序列化成我們的對象
# cc.catchMouse() # 貓依然是貓. 還可以抓??

# 一次放入多只
# class Cat:
# def __init__(self, name, color):
# self.name = name
# self.color = color
#
# def chi(self):
# print("我家的%s貓吃人" %self.name)
#
# c = Cat("Tom", "黑色")
# c1 = Cat("Tom1", "黑色1")
# c2 = Cat("Tom2", "黑色1")
# c3 = Cat("Tom3", "黑色1")
# c4 = Cat("Tom4", "黑色1")
# lst = [c, c1, c2, c3, c4]
#
# cc = pickle.dump(lst, open("mao.dat", mode="wb")) # pickle模式可以直接將列表寫入文件
# lis = pickle.load(open("mao.dat", mode="rb"))
# for s in lis:
# s.chi()
# 總結pickle:是先將對象打散成字節在寫入文件中

# pickle面向對象完成登錄註冊
# import pickle
# class User:
# def __init__(self, username, password):
# self.username = username
# self.password = password
#
# class Main:
#
# def regiset(self):
# user = input("請輸入你註冊賬號:")
# pwd = input("請輸入你註冊密碼:")
# u = User(user, pwd)
# pickle.dump(u, open("maoo.dat", mode="ab"))
# print("註冊成功!!!")
#
# def login(self):
# user = input("請輸入你的賬號:")
# pwd = input("請輸入你的密碼:")
# f = open("maoo.dat", mode="rb", )
# while True:
# try:
# u = pickle.load(f)
# # print(u.username)
# # print(u.password)
# if u.username == user and u.password == pwd:
# print("登錄成功")
# break
# except Exception:
# print("登錄失敗")
# break
#
# Main().regiset()
# Main().regiset()
# Main().login()

# 三、shelve
# shelve提供python的持久化操作. 什麽叫持久化操作呢? 說?話,就是把數據寫到硬盤上.
# 在操作shelve的時候非常的像操作?個字典. 這個東?到後期. 就像redis差不多.
# import shelve
# d = shelve.open("shaobing")
# d["jj"] = "林俊傑"
# print(d["jj"]) # "林俊傑"
# d["jj"] = "周傑倫"
# print(d["jj"]) # "周傑倫"
# d.close()

# shelve小坑
# import shelve
# s = shelve.open("sylar")
# s["jay"] = {"name":"周傑倫", "age":18, "hobby":"哄?孩"}
# print(s[‘jay‘]) # {‘name‘: ‘周傑倫‘, ‘age‘: 18, ‘hobby‘: ‘哄?孩‘}
# s.close()
#
# s = shelve.open("sylar")
# s[‘jay‘][‘name‘] = "胡辣湯" # 嘗試改變字典中的數據
# s.close()
#
# s = shelve.open("sylar")
# print(s[‘jay‘]) # # {‘name‘: ‘周傑倫‘, ‘age‘: 18, ‘hobby‘: ‘哄?孩‘} 並沒有改變
# # 原因你改變了這一項可以理解成產生一個新的字典
# s.close()
# # 解決方案
# # 1、重新用一個新的中間變量
# s = shelve.open("sylar", writeback=True)
# s[‘jay‘][‘name‘] = "胡辣湯" # 嘗試改變字典中的數據
# s.close()
# s = shelve.open("sylar")
# print(s[‘jay‘]) # 改變了.
# s.close()
# writeback=True可以動態的把我們修改的信息寫入到?件中. ?且這個?東?還可以刪
# 除數據. 就像字典?樣. 上?波操作(相當於修改後再寫入)
# s = shelve.open("sylar", writeback=True)
# del s[‘jay‘]
# s.close()
# s = shelve.open("sylar")
# print(s[‘jay‘]) # 報錯了, 沒有了
# s.close()
# s = shelve.open("sylar", writeback=True)
# s[‘jay‘] = "周傑倫"
# s[‘wlj‘] = "王?宏"
# s.close()
# s = shelve.open("sylar")
# for k in s: # 像字典?樣遍歷
# print(k)
# print(s.keys()) # 拿到所有key的集合
# for k in s.keys():
# print(k)
# for k, v in s.items(): # 像字典?樣操作
# print(k, v)
# s.close()

# 四、json
# json是我們前後端交互的樞紐. 相當於編程界的普通話. ?家溝通都?
# json. 為什麽這樣呢? 因為json的語法格式可以完美的表?出?個對象. 那什麽是json: json全
# 稱javascript object notation. 翻譯過來叫js對象簡譜. 很復雜是吧? 來上?段我們認識的代
# 碼:
# wf = {
# "name":"汪峰",
# "age":18,
# "hobby":"上頭條",
# "wife":{
# "name":‘?怡‘,
# "age":19,
# "hobby":["唱歌", "跳舞", "演戲"]
# }
# }
# 在python?這玩意叫字典. 但是在javascript?這東?叫json. ?
# 模?樣的. 我們發現?這樣的數據結構可以完美的表?出任何對象. 並且可以完整的把對象
# 表?出來. 只要代碼格式比較好. 那可讀性也是很強的. 所以?家公認?這樣?種數據結構作
# 為數據交互的格式.

# import json
# dic = {"烽火": "戲諸侯", "江山": "美人", "少年": "很騷", "哈哈":False}
# # d = json.dumps(dic) #{"\u70fd\u706b": "\u620f\u8bf8\u4faf", "\u6c5f\u5c71": "\u7f8e\u4eba", "\u5c11\u5e74": "\u5f88\u9a9a"} #寫成字節
# d = json.dumps(dic, ensure_ascii= False)
# print(d) # {"烽火": "戲諸侯", "江山": "美人", "少年": "很騷", "哈哈": false}
# print(type(d)) # <class ‘str‘>

# s = ‘{"烽火": "戲諸侯", "江山": "美人", "少年": "很騷", "哈哈": false}‘
# s1 = json.loads(s) # 將s轉化為字典
# print(s1) # {‘烽火‘: ‘戲諸侯‘, ‘江山‘: ‘美人‘, ‘少年‘: ‘很騷‘, ‘哈哈‘: False}
# print(type(s1)) # <class ‘dict‘>


# dic = {"烽火": "戲諸侯", "江山": "美人", "少年": "很騷", "哈哈": False, "wf": {"name": "王分", "hobby": "皮褲"}}
# d = json.dump(dic, open("江山", mode="w", encoding="utf-8"), ensure_ascii=False, indent=4)
# d1 = json.load(open("江山", mode="r", encoding="utf-8"))
# print(d1)

#對象怎麽寫入文件 怎麽拿?
# class Person:
# def __init__(self, name, gender):
# self.name = name
# self.gender = gender
# p = Person("黑皮", "男")
# print(p.__dict__)
# s = json.dumps(p.__dict__, ensure_ascii=False)
# print(s)

# def func(obj):
# return {
# "name": obj.name,
# "gender": obj.gender
# }
# s1 = json.dumps(p, default=func, ensure_ascii=False)
# print(s1)

# x = ‘{"name": "黑皮", "gender": "男"}‘ # json字符串裏面只能用雙引號,外面用單引號
# def func(obj):
# return Person(obj["name"], obj["gender"])
# x1 = json.loads(x, object_hook=func)
# print(x1.name)

# 五、configparser模塊
# 該模塊適用於配置文件格式與windows ini文件類似,可以包含一個或多個節(section)
# 每個節可以有多個參數(鍵=值)
# 手動配置文件
import configparser # 將config文件看成一個大字典、裏面套的是小字典(操作和字典相似)
config = configparser.ConfigParser()
config["DEFAULT"] = { # ["DEFAULT"] 這一項是配置默認文件,下面的每一項默認都帶著"DEFAULT"中的每一項
"sleep": 1000,
"session-time-out": 30,
"user-alive": 99999
}

config["TEST-DB"] = {
"db_ip": "192.168.17.189",
"port": "3306",
"u_name": "root",
"u_pwd": "123456"
}
config[‘168-DB‘] = {
"db_ip": "152.163.18.168",
"port": "3306",
"u_name": "root",
"u_pwd": "123456"
}

config["173-DB"] = {
"db_ip": "152.163.18.173",
"port": "3306",
"u_name": "root",
"u_pwd": "123456"
}

f = open("date.ini", mode="w", encoding="utf-8")
config.write(f) # 寫入文件
f.flush()
f.close()

# 讀取文件:
# config = configparser.ConfigParser()
# config.read("date.ini") # 讀取文件
# print(config.sections()) #[‘TEST-DB‘, ‘173-DB‘] 獲取到section. 章節...DEFAULT是給每個章節都配備的信息
# print(config.get("DEFAULT", "SESSION-TIME-OUT")) # 30 從xxx章節中讀取到xxx信息
# print(config["TEST-DB"][‘DB_IP‘]) # 192.168.17.189
# print(config["173-DB"]["db_ip"]) # 152.163.18.173
# 將config看成一個字典操作就行
# for k in config[‘168-DB‘]:
# print(k)
# 結果:
# db_ip
# port
# u_name
# u_pwd
# sleep
# session-time-out
# user-alive

# print(config.options(‘168-DB‘)) # [‘db_ip‘, ‘port‘, ‘u_name‘, ‘u_pwd‘, ‘sleep‘, ‘session-time-out‘, ‘user-alive‘] 同for循環,找到‘168-DB‘下所有鍵
# print(config.items(‘168-DB‘)) #找到‘168-DB‘下所有鍵值對
# print(config.get(‘168-DB‘,‘db_ip‘)) # 152.163.18.168 get?法Section下的key對應的value

# 先讀取. 然後修改. 最後寫回?件
config = configparser.ConfigParser()
config.read("date.ini") # 讀取?件
# 添加?個章節
config.add_section("189-DB")
config["189-DB"] = {
"db_ip": "167.76.22.189",
"port": "3306",
"u_name": "root",
"u_pwd": "123456"
}

# 修改信息
config.set("168-DB", "db_ip", "10.10.10.168")

# 刪除章節
config.remove_section("173-DB")

# 刪除元素信息
config.remove_option("168-DB", "u_name")

# 寫回?件
config.write(open("db.ini", mode="w"))

python D22 序列化