python中常用的模块二
一.序列化
指:在我們存儲(chǔ)數(shù)據(jù)的時(shí)候,需要對(duì)我們的對(duì)象進(jìn)行處理,把對(duì)象處理成方便存儲(chǔ)和傳輸?shù)臄?shù)據(jù)格式,這個(gè)就是序列化,
不同的序列化結(jié)果不同,但目的是一樣的,都是為了存儲(chǔ)和傳輸.
一,pickle.可以將我們python中的任意數(shù)據(jù)類型轉(zhuǎn)化成bytes并寫(xiě)入到文件中.
同樣也可以把文件中寫(xiě)好的bytes轉(zhuǎn)換回我們的python的數(shù)據(jù).這個(gè)過(guò)程被稱為序列化
import pickle class Cat:def __init__(self, name, age):self.name = nameself.age = agedef catchMouse(self):print(self.name, "抓??") c = Cat("jerry", 18) bs = pickle.dumps(c) # 序列化一個(gè)對(duì)象. print(bs) # 一堆二進(jìn)制. 看不懂 cc = pickle.loads(bs) # 把二進(jìn)制反序列化成我們的對(duì)象 cc.catchMouse() # 貓依然是貓. 還可以抓老鼠 pickle中的dumps可以序列化一個(gè)對(duì)象. loads可以反序列化一個(gè)對(duì)象. 我們使用dump 還可以直接 把一個(gè)對(duì)象寫(xiě)入到文件中 # f = open("cat", mode="wb") # pickle.dump(c, f) # 寫(xiě)到?件中 # f.close() f = open("cat", mode="rb") cc = pickle.load(f) # 從文件中讀取對(duì)象 cc.catchMouse()pickle還?持多個(gè)對(duì)象的寫(xiě)出.
lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)] f = open("cat", mode="wb") for el in lst:pickle.dump(el, f) # 寫(xiě)?到?件中 f.close() f = open("cat", mode="rb") for i in range(len(lst)):cc = pickle.load(f) # 從?件中讀取對(duì)象cc.catchMouse() lst = [c1, c2, c3] f = open("cat.dat", mode="ab") pickle.dump(lst, f) # 把對(duì)象寫(xiě)到文件中f = open("cat.dat", mode="rb") lst = pickle.load(f) # 讀取第一次 for cc in lst:cc.chi() 用戶注冊(cè)與登錄 class User:def __init__(self, username, password):self.username = usernameself.password = passwordclass 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) # 從文件里把對(duì)象拿出來(lái)if u.username == uname and u.password == pwd:print("login successful !!")breakexcept Exception as e:print("login failed !!!")breakc = client() # c.regist() # c.regist() # c.regist() # c.regist() c.login()三.shelve
shelve. 簡(jiǎn)單另類的一種序列化的方案. 有點(diǎn)?類似redis. 可以作為 一種小型的數(shù)據(jù)庫(kù)來(lái)使用
shelve提供python的持久化操作就是把數(shù)據(jù)寫(xiě)到硬盤上. 在操作shelve的時(shí)候非常的像操作一個(gè)字典
import shelve shelf = shelve.open("sylar") # shelf["jay"] = "周杰倫" print(shelf['jay']) shelf.close()我們存儲(chǔ) ?些復(fù)雜的數(shù)據(jù)
我們存儲(chǔ)一些復(fù)雜的數(shù)據(jù) s = shelve.open("sylar") # s["jay"] = {"name":"周杰倫", "age":18, "hobby":"哄?孩"} print(s['jay']) s.close() 修改時(shí)注意需添加參數(shù)writeback=True s = shelve.open("sylar", writeback=True) s['jay']['name'] = "胡辣湯" # 嘗試改變字典中的數(shù)據(jù) s.close() s = shelve.open("sylar") print(s['jay']) # 改變了. s.close()writeback=True可以動(dòng)態(tài)的把我們修改的信息寫(xiě)入到文件中還可以刪 除數(shù)據(jù). 就像字典?樣. s = shelve.open("sylar", writeback=True) del s['jay'] s.close()s = shelve.open("sylar") print(s['jay']) # 報(bào)錯(cuò)了, 沒(méi)有了 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(重點(diǎn))
概念??json. 將python中常用的字典, 列表轉(zhuǎn)化成字符串. 是目前前后端數(shù)據(jù)交互使用頻率 最高的一種數(shù)據(jù)格式.
json是我們前后端交互的樞紐. 相當(dāng)于編程界的普通話. 大家溝通都用 json.因?yàn)閖son的語(yǔ)法格式可以完美的表示出一個(gè)對(duì)象.
json全 稱javascript object notation. 翻譯過(guò)來(lái)叫js對(duì)象
wf = {"name":"汪峰","age":18,"hobby":"上頭條","wife":{"name":'?怡',"age":19,"hobby":["唱歌", "跳舞", "演戲"]}用xml寫(xiě)
<?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 例一 # 準(zhǔn)備一個(gè)字典 dic = {"a": "小蘿莉", "b": "大蘿莉", "c": "猥瑣大叔", "d": False, "e": None} # python中可以直接把字典或者列表轉(zhuǎn)化成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轉(zhuǎn)化成字典 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個(gè)空格 = 1個(gè)tabf = open("sylar.json", mode="r", encoding="utf-8") d = json.load(f) print(d) 例四 class Person:def __init__(self, firstName, lastName):self.firstName = firstNameself.lastName = lastNames = '{"firstName": "尼古拉斯", "lastName": "劉能"}' def func(dic):return Person(dic['firstName'], dic["lastName"]) p = json.loads(s, object_hook=func) # 通過(guò)函數(shù)func把字典轉(zhuǎn)換回對(duì)象 print(p.firstName, p.lastName) p = Person("尼古拉斯", "劉能") 例五 #把對(duì)象轉(zhuǎn)換成json s = json.dumps(p.__dict__, ensure_ascii=False) # 方案一, 轉(zhuǎn)的是字典 def func(obj):return {"firstName": obj.firstName,"lastName": obj.lastName} s = json.dumps(p, default=func, ensure_ascii=False) # 方案二 轉(zhuǎn)化的也是字典 print(s) 例六 dic1 = {"name":'毒液', "評(píng)分": "0.9"} dic2 = {"name":'與神同行', "評(píng)分": "10"} dic3 = {"name":'看不見(jiàn)的客人', "評(píng)分": "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) # 當(dāng)json文件中保存多個(gè)json的時(shí)候不能一次性全部都讀取出來(lái) print(dic1)f = open("movie.json", mode="r", encoding="utf-8") for line in f:line = line.strip()if line == "":continueelse:d = json.loads(line) # 一行一行的處理print(d)五 configparser模塊
該模塊適?于配置?件的格式與windows ini文件類似,可以包含一個(gè)或多個(gè)節(jié)(section)每個(gè)節(jié) 可以有多個(gè)參數(shù)(鍵=值). 首先, 我們先看一個(gè)xxx服務(wù)器的配置文件
import configparser config = configparser.ConfigParser() # 創(chuàng)建對(duì)象config['DEFAULT'] = { # 特殊"name":"騰訊qq木馬","time":"qq更新時(shí)間","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" }# 寫(xiě)入到文件 config.write(open("qq.ini", mode="w", encoding="utf-8"))# 讀取內(nèi)容 config = configparser.ConfigParser() # 讀取內(nèi)容 config.read("qq.ini", encoding="utf-8") # 此時(shí)我們把文件中的內(nèi)容讀取到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() # # 讀取內(nèi)容 # config.read("qq.ini", encoding="utf-8") # 此時(shí)我們把文件中的內(nèi)容讀取到config # config['SERVER_1']['NAME'] = "哈哈哈" # config.write(open("qq.ini", mode="w", encoding="utf-8"))# 先讀取. 然后修改. 最后寫(xiě)回文件 config = configparser.ConfigParser() config.read("db.ini") # 讀取文件 # 添加一個(gè)章節(jié) # 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") # 刪除章節(jié) config.remove_section("173-DB") # 刪除元素信息 config.remove_option("168-DB", "u_name") # 寫(xiě)回文件 config.write(open("db.ini", mode="w"))
轉(zhuǎn)載于:https://www.cnblogs.com/liucsxiaoxiaobai/p/9966814.html
總結(jié)
以上是生活随笔為你收集整理的python中常用的模块二的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 陌尤是真的吗
- 下一篇: websocket python爬虫_p