模組
json模組
用於多種語言互動 程式語言中的通用資料
內建的模組 不需要安裝,直接匯入使用
import json 匯入一個json模組
dic = {'1':2}
s = json.jumps(dic) 將字典物件轉換成字串
print(types)
d = json.loads(s) 將字串轉換成字典
print(d)
print(type(d))
json.dump({'1':4,open('a','w',encoding='utf-8')) 寫入檔案
d = json.load(open('a','r',encoding='utf-8')) 讀檔案
d['1'] = 10 修改檔案
json.dump(d,open('a','w',encoding='utf-8')) 把字典d寫入到檔案a裡
d = json.load(open('a','r',encoding='utf-8')) 讀檔案
print(d)
import json dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = json.dumps(dic) #序列化:將一個字典轉換成一個字串 print(type(str_dic),str_dic) #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"} #注意,json轉換完的字串型別的字典中的字串是由""表示的 dic2 = json.loads(str_dic) #反序列化:將一個字串格式的字典轉換成一個字典 #注意,要用json的loads功能處理的字串型別的字典中的字串必須由""表示 print(type(dic2),dic2) #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}] str_dic = json.dumps(list_dic) #也可以處理巢狀的資料型別 print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] list_dic2 = json.loads(str_dic) print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}] loads和dumps dumps loads
import json f = open('json_file','w') dic = {'k1':'v1','k2':'v2','k3':'v3'} json.dump(dic,f) #dump方法接收一個檔案控制程式碼,直接將字典轉換成json字串寫入檔案 f.close() f = open('json_file') dic2 = json.load(f) #load方法接收一個檔案控制程式碼,直接將檔案中的json字串轉換成資料結構返回 f.close() print(type(dic2),dic2) dump load
1 import json 2 3 ATM 4 5 d = json.load(open('a','r',encoding='utf-8')) 6 print(d) 7 8 d['money'] += 500 9 10 print(d) 11 12 d['money'] -= 100 13 14 import json 15 d = json.load(open('a','r',encoding='utf-8')) 16 print(d)
json總結
json.loda() 引數:檔案控制程式碼(r) 作用:將檔案中字串轉換為字典
json.dump() 物件(字典) 引數:檔案控制程式碼(w) 將字典轉換成字串寫入到檔案
json.dumps() 物件(字典) 將字典轉為字串
json.loads() 字串(字典) 將字串轉換成字典
真正的json模組
import json
data = {'username':['李華','二愣子'],'sex':'male','age':16}
json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) (字典名,字典鍵值對排序,縮排,分隔符(和預設一樣),元素內有中文就要有這個)
print(json_dic2)
pickle
只支援python 功能和json類似
import pickle
print(pickle.dumps({'1':4})) 將物件轉換成類似二進位制的東西
print(pickle.loads(b'\x80\x03}q\x00X\x01\x00\x00\x001q\x01K\x04s.')) 將一堆類似二進位制的東西轉換為字典
pickle.dump({'2':4},open('b','wb'))
d = pickle.load(open('b','rb'))
print(d)
import pickle dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = pickle.dumps(dic) print(str_dic) #一串二進位制內容 dic2 = pickle.loads(str_dic) print(dic2) #字典 import time struct_time = time.localtime(1000000000) print(struct_time) f = open('pickle_file','wb') pickle.dump(struct_time,f) f.close() f = open('pickle_file','rb') struct_time2 = pickle.load(f) print(struct_time2.tm_year) pickle
總結:
josn,pickle 對比
loads json裡的將字串轉換成字典 pickle 將位元組轉換成字典
dumps json裡的將字典轉換成字串 pickle 將字典轉換成位元組
load json裡的將檔案中的字串轉換成字典 pickle 將檔案中的位元組轉換成字典
dump json裡的將字典轉換字串寫入到檔案中,pickle 將字典轉換成位元組寫入到檔案中
shelve
shelve也是python提供給我們的序列化工具,比pickle用起來更簡單一些。
shelve只提供給我們一個open方法,是用key來訪問的,使用起來和字典類似。
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)
這個模組有個限制,它不支援多個應用同一時間往同一個DB進行寫操作。所以當我們知道我們的應用如果只進行讀操作,我們可以讓shelve通過只讀方式開啟DB
import shelve f = shelve.open('shelve_file', flag='r') existing = f['key'] f.close() print(existing)
由於shelve在預設情況下是不會記錄待持久化物件的任何修改的,所以我們在shelve.open()時候需要修改預設引數,否則物件的修改不會儲存。
import shelve f1 = shelve.open('shelve_file') print(f1['key']) f1['key']['new_value'] = 'this was not here before' f1.close() f2 = shelve.open('shelve_file', writeback=True) print(f2['key']) f2['key']['new_value'] = 'this was not here before' f2.close() 設定writeback
writeback方式有優點也有缺點。優點是減少了我們出錯的概率,並且讓物件的持久化對使用者更加的透明瞭;但這種方式並不是所有的情況下都需要,首先,使用writeback以後,shelf在open()的時候會增加額外的記憶體消耗,並且當DB在close()的時候會將快取中的每一個物件都寫入到DB,這也會帶來額外的等待時間。因為shelve沒有辦法知道快取中哪些物件修改了,哪些物件沒有修改,因此所有的物件都會被寫入
random
隨機數
import random
import random # 內建的
print(random.random())
0-1 之間隨機小數
print(random.randint(1,10))
起始位置,終止位置 兩頭都包含
print(random.randrange(1,21,2))
起始位置,終止位置(不包含),步長
print(random.choice(['alex','wusir','eva_j']))
從有序資料結構中隨機選擇一個
print(random.choices(['wusir','tialaing','taihei','ritian'],k=2))
隨機選擇兩個,但是有重複
print(random.sample(['wusir','tialaing','taihei','ritian'],k=2))
隨機選擇兩個,沒有重複
li = [1,2,3,4,6]
random.shuffle(li) # 洗牌 打亂順序
print(li)
隨機數 驗證碼 微信紅包
print(chr(65),chr(90),chr(97),chr(122))
U = chr(random.randrange(65,91))
L = chr(random.randrange(97,123))
n1 = random.randrange(0,10)
n2 = random.randrange(0,10)
print(U, L,n1,n2)
os模組
#當前執行這個python檔案的工作目錄相關的工作路徑
os.getcwd() 獲取當前工作目錄,即當前python指令碼工作的目錄路徑
os.chdir("dirname") 改變當前指令碼工作目錄;相當於shell下cd
os.curdir 返回當前目錄: ('.')
os.pardir 獲取當前目錄的父目錄字串名:('..')
#和資料夾相關
os.makedirs('dirname1/dirname2') 可生成多層遞迴目錄
os.removedirs('dirname1') 若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推
os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname
os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
os.listdir('dirname') 列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印
# 和檔案相關
os.remove() 刪除一個檔案
os.rename("oldname","newname") 重新命名檔案/目錄
os.stat('path/filename') 獲取檔案/目錄資訊
# 和執行系統命令相關
os.system("bash command") 執行shell命令,直接顯示
os.popen("bash command).read() 執行shell命令,獲取執行結果
os.environ 獲取系統環境變數
#path系列,和路徑相關
os.path.abspath(path) 返回path規範化的絕對路徑
os.path.split(path) 將path分割成目錄和檔名二元組返回
os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path) 返回path最後的檔名。如何path以/或\結尾,那麼就會返回空值,即os.path.split(path)的第二個元素。
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是絕對路徑,返回True
os.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回False
os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False
os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的引數將被忽略 os.path.join('C:\\','app','a','b') ---> C:app\a\b
os.path.getatime(path) 返回path所指向的檔案或者目錄的最後訪問時間
os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間
os.path.getsize(path) 返回path的大小
sys模組
python直譯器互動的 內建的
import sys
print(sys.argv[-1]) ***
接受cmd方式呼叫 後邊的引數會傳遞進來
linux系統上 -- 後端開發 -- 資料庫(檔案) ip + 埠
print(sys.path) # 新增自定義模組路勁的 # ******
print(sys.version) # 版本 獲取解釋的版本號
sys.platform = 'win1988'
print(sys.platform) #獲取當前作業系統的平臺位數 # 不是定死的
print(sys.exit(1))
hashlib
加密演算法
作用: 當做密碼
判斷一致性
加密後不可逆 不能解 (一年前暴力破解 -- 撞庫)
(現在md5 反推)
sha1,sha256,sha512
alex3714
**********
import hashlib
md5 = hashlib.md5('鹽'.encode('utf-8')) # 選擇加密方式 加鹽
md5.update('alex3714'.encode('utf-8')) # 將明文轉成位元組然後進行加密
print(md5.hexdigest()) # 生成密文
md5 = hashlib.md5() # 選擇加密方式 加鹽
md5.update('alex3714'.encode('utf-8')) # 將明文轉成位元組然後進行加密
print(md5.hexdigest()) # 生成密文
sha512 = hashlib.sha512()
sha512.update('alex3714'.encode('utf-8'))
print(sha512.hexdigest())
sha512
優點: 安全 缺點:速度慢
md5
優點:安全,快 缺點:易被破解
user,pwd = input('user|pwd:').strip().split('|')
import hashlib
md5 = hashlib.md5(str(user).encode('utf-8'))
md5.update(pwd.encode('utf-8'))
print(md5.hexdigest())
md5,sha1,sha256,sha512
重要內容
1.序列化
json # 必會
dump 把字典轉成字串存入檔案
load 將檔案的字串轉成字典
dumps 將字典轉成字串
loads 將字串轉成字典
pickle # 瞭解
shevle # 瞭解
2. 隨機數
random.random() 0-1 之間的小數
驗證碼
random.randint(1,10)
3. os 作業系統
路徑部分
os.path.join
os.path.abspath
os.path.basename
os.path.dirname
os.path.getsize() # 獲取大小
os.remove()
os.rename()
os.listdir()
os.chdir() # 切換目錄
os.makedirs('app/a/b') 遞迴建立資料夾
os.removedirs('app/a/b') 遞迴刪除
os.mkdir() 建立單個資料夾
os.rmdir() 刪除單個資料夾
sys python直譯器
sys.argv() 在cmd中執行 可以將檔案 後的內容傳遞到檔案中使用
sys.path python直譯器載入的路徑,自定義模組新增到這裡
sys.exit()
sys.version() 獲取直譯器的版本號
sys.platform 獲取當前平臺的位數
hashlib 加密演算法
md5,sha1,sha256,sha512
1.先匯入模組
2.建立一個加密方式
3.將要加密的內容編碼成位元組後加密
4.生成密文
import hashlib
md5 = hashlib.md5(b'alex')
md5.update('alex3714'.encode('utf-8'))
print(md5.hexdigest())