日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

常用模块-02

發(fā)布時(shí)間:2025/4/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常用模块-02 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

主要內(nèi)容
1. 什么是序列化
2. pickle
3. shelve
4. json
5. configparser模塊

一. 什么是序列化
在我們存儲(chǔ)數(shù)據(jù)或者網(wǎng)絡(luò)傳輸數(shù)據(jù)的時(shí)候. 需要對(duì)我們的對(duì)象進(jìn)行處理. 把對(duì)象處理成
方便存儲(chǔ)和傳輸?shù)臄?shù)據(jù)格式. 這個(gè)過(guò)程叫>>>序列化<<<. 不同的序列列化, 結(jié)果也不同. 但是目的是一樣的. 都是為了存儲(chǔ)和傳輸.
在python中存在三種序列化的方案.
◎1. pickle. 可以將我們python中的任意數(shù)據(jù)類(lèi)型轉(zhuǎn)化成bytes并寫(xiě)入到文件中. 同樣也可以把文件中寫(xiě)好的bytes轉(zhuǎn)換回我們python的數(shù)據(jù). 這個(gè)過(guò)程被稱為反序列化

◎2. shelve. 簡(jiǎn)單另類(lèi)的一種序列化的方案. 有點(diǎn)兒類(lèi)似后面我們學(xué)到的redis. 可以作為一種小型的數(shù)據(jù)庫(kù)來(lái)使用
◎3. json. 將python中常見(jiàn)的字典, 列表轉(zhuǎn)化成字符串. 是目前后端數(shù)據(jù)交互使?用頻率最高的一種數(shù)據(jù)格式.

二. pickle
pickle用起來(lái)很簡(jiǎn)單. 說(shuō)白了. 就是把我們的python對(duì)象寫(xiě)入到文件中的一種解決方案.
但是寫(xiě)入到文件的是bytes. 所以這東西不是給人看的. 是給機(jī)器看的.

import pickle # dumps 序列化。 把對(duì)象轉(zhuǎn)化成bytes
# loads 反序列化。 把bytes轉(zhuǎn)化成對(duì)象
# dump 序列化。 把對(duì)象轉(zhuǎn)化成bytes并寫(xiě)入文件
# load 反序列化。把文件中的bytes讀取。轉(zhuǎn)化成對(duì)象 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ě)出:

#1.
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()


#+2.
lst = [Cat("貓1", 10), Cat("貓2", 9), Cat("貓3", 8), Cat("貓4", 7), Cat("貓5", 6)] f = open("pickle-test", mode="wb")
pickle.dump(lst, f)
for el in lst:
pickle.dump(el, f)

f.flush()
f.close()

  ◆但是這樣寫(xiě)并不夠好. 因?yàn)樽x的時(shí)候. 并不能知道有多少對(duì)象要讀. 這里記住, 不能一行一行的讀. 那真的要寫(xiě)入或者讀取多個(gè)內(nèi)容怎么辦? 很簡(jiǎn)單. 裝lis里. 然后讀取和寫(xiě)入都用list

lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)] f = open("pickle-test", mode="rb")
while 1:
try:
c1 = pickle.load(f)
c1.catchMouse()
except EOFError:
break

  記住一點(diǎn), pickle序列化的內(nèi)容是二進(jìn)制的內(nèi)容(bytes) 不是給人看的.

三. shelve
shelve提供python的 >>>持久化<<< 操作. 什么叫持久化操作呢? 說(shuō)白話,就是把數(shù)據(jù)寫(xiě)到硬盤(pán)上.
在操作shelve的時(shí)候非常的像操作一個(gè)字典. 這個(gè)東西到后期. 就像redis差不多.

import shelveshelf = 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()

# 但是, 有坑
s = shelve.open("sylar")
s['jay']['name'] = "胡辣湯" # 嘗試改變字典中的數(shù)據(jù)
s.close()
s = shelve.open("sylar")
print(s['jay']) # 并沒(méi)有改變
s.close()
# 解決方案:
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()

  綜上?shelve?就當(dāng)成字典來(lái)用就行了. 它比redis還簡(jiǎn)單.......

四. ? ? ? ? ? ? ? ? ? ? ★☆★?☆ ? ? ? ? ? json ? ? ? ? ? ? ?☆★☆★
  json是我們前后端交互的樞紐. 相當(dāng)于編程界的普通話. 大家溝通都用json. 為么這樣呢? 因?yàn)閖son的語(yǔ)法格式可以完美的表示出一個(gè)對(duì)象. 那么是json: json?全稱 >>>javascript object notation?. 翻譯過(guò)來(lái)叫js對(duì)象簡(jiǎn)譜. 很復(fù)雜是吧? 來(lái)上一段簡(jiǎn)單的代碼:

wf = {"name":"汪峰","age":18,"hobby":"上頭條","wife":{"name":'?子怡',"age":19,"hobby":["唱歌", "跳舞", "演戲"]} }

這個(gè)不是字典么? 對(duì)的. 在python里這叫字典. 但是在javascript里這叫?json. 一模一樣的. 我們發(fā)現(xiàn)用這樣的數(shù)據(jù)結(jié)構(gòu)可以完美的表示出任何對(duì)象. 并且可以完整的把對(duì)象表示出來(lái). 只要代碼格式比較好. 那可讀性也是很強(qiáng)的. 所以大家公認(rèn)用這樣一種數(shù)據(jù)結(jié)構(gòu)作為數(shù)據(jù)交互的格式. 那在這個(gè)東西之前是什么呢? XML.....來(lái)看?一段代碼

<?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>

  古人(老程序員)都是用這樣的數(shù)據(jù)進(jìn)行傳輸?shù)? 先不管這個(gè)東西好不好看. 這玩意想要解析.. 那簡(jiǎn)直了. 想死的心都有. 所以老版本的xml在維護(hù)和處理理上是非常復(fù)雜和繁瑣的. 以前的項(xiàng)目幾乎沒(méi)有用ajax的.
  那json既然這么牛B好?用. 怎么用呢? 注意. 這里又出來(lái)一個(gè)新問(wèn)題. 我們的程序是在python?里寫(xiě)的. 但是前端是在JS那邊來(lái)解析json的. 所以. 我們需要把我們程序產(chǎn)生的字典轉(zhuǎn)化成json格式的json串(字符串). 然后網(wǎng)絡(luò)傳輸. 那邊接收到了之后. 它愛(ài)怎么處理是它的事情. 那, 如何把字典轉(zhuǎn)化成我們的json格式的字符串呢?很簡(jiǎn)單, 上代碼:

import json dic = {"a": "女王", "b": "蘿莉", "c": "小清新"} s = json.dumps(dic) # 把字典轉(zhuǎn)化成json字符串 print(s) # {"a": "\u5973\u738b", "b": "\u841d\u8389", "c":"\u5c0f\u6e05\u65b0"}
# 結(jié)果很不友好啊. 那如何處理中文呢? 在dumps的時(shí)候給出另一個(gè)參數(shù)ensure_ascii=False就可以了 import json dic = {"a": "女王", "b": "蘿莉", "c": "小清新"} s = json.dumps(dic, ensure_ascii=False) # 把字典轉(zhuǎn)化成json字符串 print(s) # {"a": "女王", "b": "蘿莉", "c": "小清新"}

# 假如,前端給你傳遞信息了. 你要把前端傳遞過(guò)來(lái)的json字符串轉(zhuǎn)化成字典: import json s = '{"a": "女王", "b": "蘿莉", "c": "小清新"}' dic = json.loads(s) print(type(dic), dic)
# json也可以像pickle一樣把序列化的結(jié)果寫(xiě)入到文件中. dic = {"a": "女王", "b": "蘿莉", "c": "小清新"} f = open("test.json", mode="w", encoding="utf-8") json.dump(dic, f, ensure_ascii=False) # 把對(duì)象打散成json寫(xiě)入到文件中 f.close()同樣也可以從文件中讀取一個(gè)json f = open("test.json", mode="r", encoding="utf-8") dic = json.load(f) f.close() print(dic)
# ★ 注意. 我們可以向同一個(gè)文件中寫(xiě)入多個(gè)json串. 但是讀不行. import json lst = [{"a": 1}, {"b": 2}, {"c": 3}] f = open("test.json", mode="w", encoding="utf-8") for el in lst:json.dump(el, f) f.close()
# 注意, 此時(shí)文件中的內(nèi)容是一行內(nèi)容: # >>> {"a": 1}{"b": 2}{"c": 3}
# 這在讀取的時(shí)候是無(wú)法正常讀取的. 那如何解決呢? 兩套?方案. 方案一. 把所有的內(nèi)容準(zhǔn)備好統(tǒng)一 # 進(jìn)行寫(xiě)入和讀取. 但這樣處理, 如果數(shù)據(jù)量小還好. 數(shù)據(jù)量大的話, 就不夠友好了. 方案二. 不用dump.
# 改用dumps和loads. 對(duì)每一行分別進(jìn)行處理:
import json lst = [{"a": 1}, {"b": 2}, {"c": 3}]
# 寫(xiě)入的時(shí)候
# 1. 循環(huán)
# 2. 用dumps把字典轉(zhuǎn)化成字符串, 然后手工在后面加一個(gè)\n
# 3. 寫(xiě)出

f = open("test.json", mode="w", encoding="utf-8")
for el in lst:   
  s = json.dumps(el, ensure_ascii=True) + "\n"
  f.write(s)
f.close() # 讀取的時(shí)候
# 1. for line in f:
# 2. strip()去掉空白
# 3. loads()變成字典 f = open("test.json", mode="r", encoding="utf-8")
for line in f:
  dic = json.loads(line.strip())
  print(dic)
f.close()

五. configparser模塊
該模塊適用于配置文件的格式與windows ini文件類(lèi)似,可以包含一個(gè)或多個(gè)節(jié)(section)每個(gè)節(jié)
可以有多個(gè)參數(shù)(鍵=值).

[DEFAULT] ServerAliveInterval = 45 Compression = yes CompressionLevel = 9 ForwardX11 = yes
[[ bitbucket.org]] User = hg
[[ topsecret.server.com]] Port = 50022 ForwardX11 = no
# 我們用configparser就可以對(duì)這樣的文件進(jìn)行處理.首先, 是初始化 import configparser

config = configparser.ConfigParser() config['DEFAULT'] = {"sleep": 1000,"session-time-out": 30,"user-alive": 999999 }
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("db.ini", mode="w") config.write(f) # 寫(xiě)入文件 f.flush() f.close()
# 讀取文件信息: config = configparser.ConfigParser()
config.read("db.ini") # 讀取文件 print(config.sections()) # 獲取到section. 章節(jié)...DEFAULT是給每個(gè)章節(jié)都配備的信息 print(config.get("DEFAULT", "SESSION-TIME-OUT")) # 從xxx章節(jié)中讀取到xxx信息 # ◆ 也可以像字典一樣操作 print(config["TEST-DB"]['DB_IP']) print(config["173-DB"]["db_ip"])
for k in config['168-DB']:print(k) for k, v in config["168-DB"].items():print(k, v)
print(config.options('168-DB')) # 同for循環(huán),找到'168-DB'下所有鍵 print(config.items('168-DB')) #找到'168-DB'下所有鍵值對(duì) print(config.get('168-DB','db_ip')) # 152.163.18.168 get方法Section下的key對(duì)應(yīng)的value
# ◆ 增刪改操作: # ◎ 先讀取. 然后修改. 最后寫(xiě)回文件 config = configparser.ConfigParser() config.read("db.ini") # 讀取文件 (全部都讀出來(lái)了)
# 添加一個(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/presleyren/p/9761028.html

總結(jié)

以上是生活随笔為你收集整理的常用模块-02的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。