python中常用的模組二
阿新 • • 發佈:2018-11-15
一.序列化
指:在我們儲存資料的時候,需要對我們的物件進行處理,把物件處理成方便儲存和傳輸的資料格式,這個就是序列化,
不同的序列化結果不同,但目的是一樣的,都是為了儲存和傳輸.
一,pickle.可以將我們python中的任意資料型別轉化成bytes並寫入到檔案中.
同樣也可以把檔案中寫好的bytes轉換回我們的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() # 貓依然是貓. 還可以抓老鼠
pickle中的dumps可以序列化一個物件. loads可以反序列化一個物件. 我們使用dump 還可以直接 把一個物件寫入到檔案中 # f = open("cat", mode="wb") # pickle.dump(c, f) # 寫到⽂件中 # f.close() f = open("cat", mode="rb") cc = pickle.load(f) # 從檔案中讀取物件 cc.catchMouse()
pickle還⽀持多個物件的寫出.
lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)] f = open("cat", mode="wb") for el in lst: pickle.dump(el, f) # 寫⼊到⽂件中 f.close() f = open("cat", mode="rb") for i in range(len(lst)): cc = pickle.load(f) # 從⽂件中讀取物件 cc.catchMouse()
lst = [c1, c2, c3] f = open("cat.dat", mode="ab") pickle.dump(lst, f) # 把物件寫到檔案中 f = open("cat.dat", mode="rb") lst = pickle.load(f) # 讀取第一次 for cc in lst: cc.chi()
使用者註冊與登入 class User: def __init__(self, username, password): self.username = username self.password = password class client: def regist(self): uname = input("please input your username:") pwd = input("please input your password:") user = User(uname, pwd) pickle.dump(user, open("userinfo", mode="ab")) print("regist successful!!!") def login(self): uname = input("please input your username:") pwd = input("please input your password:") f = open("userinfo", mode="rb") while 1: try: u = pickle.load(f) # 從檔案裡把物件拿出來 if u.username == uname and u.password == pwd: print("login successful !!") break except Exception as e: print("login failed !!!") break c = client() # c.regist() # c.regist() # c.regist() # c.regist() c.login()
三.shelve
shelve. 簡單另類的一種序列化的方案. 有點⼉類似redis. 可以作為 一種小型的資料庫來使用
shelve提供python的持久化操作就是把資料寫到硬碟上. 在操作shelve的時候非常的像操作一個字典
import shelve shelf = shelve.open("sylar") # shelf["jay"] = "周杰倫" print(shelf['jay']) shelf.close()
我們儲存 ⼀些複雜的資料
我們儲存一些複雜的資料 s = shelve.open("sylar") # s["jay"] = {"name":"周杰倫", "age":18, "hobby":"哄⼩孩"} print(s['jay']) s.close() 修改時注意需新增引數writeback=True 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. 將python中常用的字典, 列表轉化成字串. 是目前前後端資料互動使用頻率 最高的一種資料格式.
json是我們前後端互動的樞紐. 相當於程式設計界的普通話. 大家溝通都用 json.因為json的語法格式可以完美的表示出一個物件.
json全 稱javascript object notation. 翻譯過來叫js物件
wf = { "name":"汪峰", "age":18, "hobby":"上頭條", "wife":{ "name":'⼦怡', "age":19, "hobby":["唱歌", "跳舞", "演戲"] }
用xml寫
<?xml version="1.0" encoding="utf-8" ?> <wf> <name>汪峰</name> <age>18</age> <hobby>上頭條</hobby> <wife> <name>子怡</name> <age>18</age> <hobbies> <hobby>唱歌</hobby> <hobby>跳舞</hobby> <hobby>演戲</hobby> </hobbies> </wife> </wf>
json案例
import json 例一 # 準備一個字典 dic = {"a": "小蘿莉", "b": "大蘿莉", "c": "猥瑣大叔", "d": False, "e": None} # python中可以直接把字典或者列表轉化成json s = json.dumps(dic, ensure_ascii=False) # pickle print(type(s)) print(s) 例二 s = '{"a": "小蘿莉", "b": "大蘿莉", "c": "猥瑣大叔", "d": false, "e": null}' d = json.loads(s) # 把json轉化成字典 print(d) print(type(d)) 例三 dic = {"a": "小蘿莉", "b": "大蘿莉", "c": "猥瑣大叔", "d": False, "e": None, "wf":{"name":"半壁江山", "hobby":"皮褲"}} f = open("sylar.json", mode="w", encoding="utf-8") json.dump(dic, f, ensure_ascii=False, indent=4) # 4個空格 = 1個tab f = open("sylar.json", mode="r", encoding="utf-8") d = json.load(f) print(d) 例四 class Person: def __init__(self, firstName, lastName): self.firstName = firstName self.lastName = lastName s = '{"firstName": "尼古拉斯", "lastName": "劉能"}' def func(dic): return Person(dic['firstName'], dic["lastName"]) p = json.loads(s, object_hook=func) # 通過函式func把字典轉換回物件 print(p.firstName, p.lastName) p = Person("尼古拉斯", "劉能") 例五 #把物件轉換成json s = json.dumps(p.__dict__, ensure_ascii=False) # 方案一, 轉的是字典 def func(obj): return { "firstName": obj.firstName, "lastName": obj.lastName } s = json.dumps(p, default=func, ensure_ascii=False) # 方案二 轉化的也是字典 print(s) 例六 dic1 = {"name":'毒液', "評分": "0.9"} dic2 = {"name":'與神同行', "評分": "10"} dic3 = {"name":'看不見的客人', "評分": "9.5"} lst = [dic1, dic2, dic3] f = open("movie.json", mode="w", encoding="utf-8") for d in lst: s = json.dumps(d, ensure_ascii=False) f.write(s+"\n") f = open("movie.json", mode="r", encoding="utf-8") dic1 = json.load(f) # 當json檔案中儲存多個json的時候不能一次性全部都讀取出來 print(dic1) f = open("movie.json", mode="r", encoding="utf-8") for line in f: line = line.strip() if line == "": continue else: d = json.loads(line) # 一行一行的處理 print(d)
五 configparser模組
該模組適⽤於配置⽂件的格式與windows ini檔案類似,可以包含一個或多個節(section)每個節 可以有多個引數(鍵=值). 首先, 我們先看一個xxx伺服器的配置檔案
import configparser config = configparser.ConfigParser() # 建立物件 config['DEFAULT'] = { # 特殊 "name":"騰訊qq木馬", "time":"qq更新時間", "version":"1.0" } config['SERVER_1'] = { "IP":"192.168.1.123", "port":"12306" } config['SERVER_2'] = { "IP":"192.168.1.178", "port":"12311" } config['SERVER_3'] = { "IP":"192.168.1.176", "port":"12312" } # 寫入到檔案 config.write(open("qq.ini", mode="w", encoding="utf-8")) # 讀取內容 config = configparser.ConfigParser() # 讀取內容 config.read("qq.ini", encoding="utf-8") # 此時我們把檔案中的內容讀取到config print(config['SERVER_1']['IP']) # 字典 print(config['SERVER_2']['name']) print(config.get("SERVER_3", "IP")) # 字典 for k, v in config['DEFAULT'].items(): print(k, v) # config = configparser.ConfigParser() # # 讀取內容 # config.read("qq.ini", encoding="utf-8") # 此時我們把檔案中的內容讀取到config # config['SERVER_1']['NAME'] = "哈哈哈" # config.write(open("qq.ini", mode="w", encoding="utf-8"))
# 先讀取. 然後修改. 最後寫回檔案 config = configparser.ConfigParser() config.read("db.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"))