Python全棧(第一期)Day20
阿新 • • 發佈:2018-12-19
今日主要內容:
實戰作業要求
模組基本知識
序列化模組
一,昨日作業:實戰
# 實戰: # 實戰一:計算時間差 # 實戰二:驗證碼 # 實戰三:計算器 # 首先得到一個字串 # 去空格 # 沒有空格的字串 # 先算最裡層括號裡的 : 找括號 ,且括號裡沒有其他括號 # 得到了一個沒有括號的表示式 :只有加減乘除 # 從左到右先找到第一個乘除法 : # 迴圈 # 乘除法第一個數的符號是不必匹配的 # 找到乘除法如何計算呢: # 先判斷是乘法還是除法 # 如果是乘法就以‘*’分割得到的內容是字串資料型別的數 # 如果是除法就用'/'分割的內容是字串資料型別的數 # 轉資料型別之後根據 '*','/'計算結果 # 結果替換原來字串中的內容 # 所有的乘除法都做完了 # 計算加減 —— 加減法 # 只有一個數了 就可以結束了
二,模組基本知識
# 所有的模組匯入都應該儘量往上寫 # 內建模組 # 擴充套件模組 # 自定義模組 # 模組不會重複被匯入 : sys.moudles # 從哪兒匯入模組 : sys.path #import # import 模組名 # 模組名.變數名 和本檔案中的變數名完全不衝突 # import 模組名 as 重新命名的模組名 : 提高程式碼的相容性 # import 模組1,模組2 #這種其實不推薦 #from import # from 模組名 import 變數名 #直接使用 變數名 就可以完成操作 #如果本檔案中有相同的變數名會發生衝突 # from 模組名 import 變數名字 as 重新命名變數名 # from 模組名 import 變數名1,變數名2 # from 模組名 import * # 將模組中的所有變數名都放到記憶體中 # 如果本檔案中有相同的變數名會發生衝突 # from 模組名 import * 和 __all__ 是一對 # 沒有這個變數,就會匯入所有的名字 # 如果有all 只匯入all列表中的名字 # __name__ # 在模組中 有一個變數__name__, # 當我們直接執行這個模組的時候,__name__ == '__main__' # 當我們執行其他模組,在其他模組中引用這個模組的時候,這個模組中的__name__ == '模組的名字'
三,序列化模組
1,基本知識
# 序列化 —— 轉向一個字串資料型別 # 序列 —— 字串 # 以下兩種情況需要序列化: # 資料儲存,寫檔案; # 網路上傳輸的時候,只能傳bytes; # 從資料型別 --> 字串的過程 序列化 # 從字串 --> 資料型別的過程 反序列化 # json *****(五星滿分,非常重要) # pickle **** # shelve *** # json: # 數字 字串 列表 字典 元組(通過中介列表) # 通用的序列化格式 # 只有很少的一部分資料型別能夠通過json轉化成字串 # pickle: # 所有的python中的資料型別都可以轉化成字串形式 # pickle序列化的內容只有python能理解 # 且部分反序列化依賴python程式碼 # shelve: # 序列化控制代碼 # 使用控制代碼直接操作,非常方便
2,json:dumps+loads
# json dumps序列化方法 loads反序列化方法
dic = {1: "a", 2: 'b'}
print(type(dic), dic)
import json
str_d = json.dumps(dic) # 序列化
print(type(str_d), str_d)
dic_d = json.loads(str_d) # 反序列化
print(type(dic_d), dic_d)
輸出結果:
<class ‘dict’> {1: ‘a’, 2: ‘b’}
<class ‘str’> {“1”: “a”, “2”: “b”}
<class ‘dict’> {‘1’: ‘a’, ‘2’: ‘b’}
3,json:dump+load
import json
#json dump load 和檔案相關的操作
dic = {1: "a", 2: 'b'}
f = open('fff', 'w', encoding='utf-8')
json.dump(dic, f)
f.close()
f = open('fff')
res = json.load(f)
f.close()
print(type(res), res)
輸出結果:
<class ‘dict’> {‘1’: ‘a’, ‘2’: ‘b’}
import json
# json dump load ,缺點:只能一次性寫進去,一次性讀出來。
dic = {1: "中國", 2: 'b'}
f = open('fff', 'w', encoding='utf-8')
json.dump(dic, f, ensure_ascii=False)
json.dump(dic, f, ensure_ascii=False)
f.close()
f = open('fff', encoding='utf-8')
res1 = json.load(f)
res2 = json.load(f)
f.close()
print(type(res1), res1)
print(type(res2), res2)
輸出結果:
程式報錯!!!!
該方式缺點:只能一次性寫入,一次性讀出。
4,json:處理檔案的方法
l = [{'k': '111'}, {'k2': '111'}, {'k3': '111'}]
f = open('file', 'w')
import json
for dic in l:
str_dic = json.dumps(dic)
f.write(str_dic+'\n')
f.close()
f = open('file')
import json
l = []
for line in f:
dic = json.loads(line.strip())
l.append(dic)
f.close()
print(l)
輸出結果:
[{‘k’: ‘111’}, {‘k2’: ‘111’}, {‘k3’: ‘111’}]
5,pickle
import pickle
dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
str_dic = pickle.dumps(dic)
print(str_dic) #一串二進位制內容,雖然我們看不懂,但是不影響使用
dic2 = pickle.loads(str_dic)
print(dic2) #字典
輸出結果:
b’\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.’
{‘k1’: ‘v1’, ‘k2’: ‘v2’, ‘k3’: ‘v3’}
import pickle
import time
struct_time1 = time.localtime(1000000000)
struct_time2 = time.localtime(2000000000)
f = open('pickle_file', 'wb')
pickle.dump(struct_time1, f)
pickle.dump(struct_time2, f)
f.close()
f = open('pickle_file', 'rb')
struct_time1 = pickle.load(f)
struct_time2 = pickle.load(f)
print(struct_time1.tm_year)
print(struct_time2.tm_year)
f.close()
輸出結果:
2001
2033
假如我們現在開啟檔案,會發現檔案中是亂碼,我們是看不懂的。
6,shelve
import shelve
f = shelve.open('shelve_file')
f['key'] = {'int': 10, 'float': 9.5, 'string': 'Sample data'} #直接對檔案控制代碼操作,就可以存入資料
f.close()
import shelve
f1 = shelve.open('shelve_file')
existing = f1['key'] #取出資料的時候也只需要直接用key獲取即可,但是如果key不存在會報錯
f1.close()
print(existing)
輸出結果:
{‘int’: 10, ‘float’: 9.5, ‘string’: ‘Sample data’}
#以只讀開啟
import shelve
f = shelve.open('shelve_file', flag='r')
existing = f['key']
print(existing)
f.close()
f = shelve.open('shelve_file', flag='r')
existing2 = f['key']
f.close()
print(existing2)
輸出結果:
{‘int’: 10, ‘float’: 9.5, ‘string’: ‘Sample data’}
{‘int’: 10, ‘float’: 9.5, ‘string’: ‘Sample data’}
補充知識點:
# writeback:由於shelve在預設情況之下是不會記錄待持久化物件的任何改動,
# 所以我們在shelve.open()時候需要修改預設引數。
import shelve
f = shelve.open('shelve_file')
f['key'] = {'int': 10, 'float': 9.5, 'string': 'Sample data'} #直接對檔案控制代碼操作,就可以存入資料
f.close()
f1 = shelve.open('shelve_file')
print(f1['key'])
f1['key']['new_value'] = 'this was not here before'
f1.close()
f3 = shelve.open('shelve_file', writeback=True)
print(f3['key'])
f3.close()
輸出結果:
自己執行時,並沒有儲存修改,以後再去查!