1. 程式人生 > >Python全棧(第一期)Day20

Python全棧(第一期)Day20

今日主要內容:
實戰作業要求
模組基本知識
序列化模組

一,昨日作業:實戰

# 實戰:
# 實戰一:計算時間差

# 實戰二:驗證碼

# 實戰三:計算器
# 首先得到一個字串
# 去空格
# 沒有空格的字串
# 先算最裡層括號裡的 : 找括號 ,且括號裡沒有其他括號
# 得到了一個沒有括號的表示式 :只有加減乘除
# 從左到右先找到第一個乘除法 :   # 迴圈
    # 乘除法第一個數的符號是不必匹配的
    # 找到乘除法如何計算呢:
        # 先判斷是乘法還是除法
        # 如果是乘法就以‘*’分割得到的內容是字串資料型別的數
        # 如果是除法就用'/'分割的內容是字串資料型別的數
        # 轉資料型別之後根據 '*','/'計算結果
        # 結果替換原來字串中的內容
# 所有的乘除法都做完了
# 計算加減  —— 加減法
# 只有一個數了 就可以結束了

二,模組基本知識

# 所有的模組匯入都應該儘量往上寫
    # 內建模組
    # 擴充套件模組
    # 自定義模組
# 模組不會重複被匯入 : 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()

輸出結果:
自己執行時,並沒有儲存修改,以後再去查!