1. 程式人生 > >python中常用的模組二

python中常用的模組二

一.序列化

指:在我們儲存資料的時候,需要對我們的物件進行處理,把物件處理成方便儲存和傳輸的資料格式,這個就是序列化,

不同的序列化結果不同,但目的是一樣的,都是為了儲存和傳輸.

一,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"))