模塊—— 序列化模塊、random模塊、os模塊 、 sys模塊、hashlib模塊、collections模塊

今天咱們來講說Python中的模塊:python

第三方模塊linux

能夠下載/安裝/使用算法

第一步:將pip.exe 所在的目錄添加到環境變量中
第二步:輸入pip
第三步:pip install 要安裝的模塊名稱  #pip install xlrd
報錯緣由:
要求更新模塊:python36 -m pip install --upgrade pip  
安裝成功不能導入:重啓pycharm、從新安裝

自定義模塊shell

  隨着程序代碼越寫越多,不易維護,因此咱們把函數分組,放在不一樣的文件中,這樣每一個文件的代碼塊就較少,一個.py文件就是一個自定義模塊數據庫

第一種 直接import
這裏有個大前提,就是你的py執行文件和模塊同屬於同個目錄(父級目錄),以下圖:

執行文件main.py 模塊文件pwcong模塊同在python目錄
pwcong模塊提供的函數寫在 __init__.py 裏,裏面只提供一個 hi 函數:
def hi():
print("hi")
執行文件main.py直接import自定義模塊

import pwcong
pwcong.hi()
第二種 經過sys模塊導入

若是執行文件和模塊不在同一個目錄下,這時用import是找不到自定義模塊的json

import sys
sys.path.append(r"C:\Users\Pwcong\Desktop\python")
import pwcong
pwcong.hi()
第三種 經過path文件導入自定義模塊

內置模塊後端

  python內部提供的功能。數組

Python中的模塊有下面這些:安全

1、序列化模塊:微信

序列化的目的:

①:以某種存儲形式使自定義對象持久化;

②:將對象從一個地方傳遞到另外一個地方;

③:使程序更具維護性。

json模塊:

json模塊提供了四個功能:dumps、dump、loads、load

首先咱們來講說dumps和loads:

   dumps:將JSON格式的編碼內容序列化成字符串格式的

源碼:
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
1 obj: 表示是要序列化的對象。 2 
 3 fp: 文件描述符,將序列化的str保存到文件中。json模塊老是生成str對象,而不是字節對象;所以,fp.write()必須支持str輸入。 4 
 5 skipkeys: 默認爲False,若是skipkeysTrue,(默認值:False),則將跳過不是基本類型(str,int,float,bool,None)的dict鍵,不會引起TypeError。 6 
 7 ensure_ascii: 默認值爲True,能將全部傳入的非ASCII字符轉義輸出。若是ensure_ascii爲False,則這些字符將按原樣輸出。 8 
 9 check_circular:默認值爲True,若是check_circular爲False,則將跳過對容器類型的循環引用檢查,循環引用將致使OverflowError。 10 
11 allow_nan: 默認值爲True,若是allow_nan爲False,則嚴格遵照JSON規範,序列化超出範圍的浮點值(nan,inf,-inf)會引起ValueError。 若是allow_nan爲True,則將使用它們的JavaScript等效項(NaN,Infinity,-Infinity)。 12 
13 indent: 設置縮進格式,默認值爲None,選擇的是最緊湊的表示。若是indent是非負整數或字符串,那麼JSON數組元素和對象成員將使用該縮進級別進行輸入;indent爲0,負數或「」僅插入換行符;indent使用正整數縮進多個空格;若是indent是一個字符串(例如「\t」),則該字符串用於縮進每一個級別。 14 
15 separators: 去除分隔符後面的空格,默認值爲None,若是指定,則分隔符應爲(item_separator,key_separator)元組。若是縮進爲None,則默認爲(’,’,’:’);要得到最緊湊的JSON表示,能夠指定(’,’,’:’)以消除空格。 16 
17 default: 默認值爲None,若是指定,則default應該是爲沒法以其餘方式序列化的對象調用的函數。它應返回對象的JSON可編碼版本或引起TypeError。若是未指定,則引起TypeError。 18 
19 sort_keys: 默認值爲False,若是sort_keys爲True,則字典的輸出將按鍵值排序。

例子:

1 import json 2 dic = {"name":"tom","age":23} 3 str_dic = json.dumps(dic)    序列化 將一個字典轉換成一個字符串 4 print(type(str_dic),str_dic)

json轉換完的字符串類型的字典中的字符串是由""表示的

   

1 import json 2 # 序列化,將python的值轉換爲json格式的字符串。
3 v = [12,3,4,{'k1':'v1'},True,'asdf'] 4 print(v,type(v)) 5 v1 = json.dumps(v) 6 print(v1,type(v1))  #[12, 3, 4, {"k1": "v1"}, true, "asdf"]

  loads:  將json格式的字符串轉換成python的數據類型

1 dic2 = json.loads(str_dic)  #反序列化:將一個字符串格式的字典轉換成一個字典
2  
3 print(type(dic2),dic2)  #<class 'dict'> 
4 
5 #注意,要用json的loads功能處理的字符串類型的字典中的字符串必須由""表示

 

1 v2 = '["alex",123]'
2 print(type(v2))       #列表類型的字符串結構
3 v3 = json.loads(v2) 4 print(v3,type(v3))  #將JSON類型的編碼內容反序列化成爲Python的內容
5 >>> ['alex', 123] <class 'list'>
6 
7 v4 = [{1,2,3},True]   #不能是元組類型,只能是集合、列表、字典類型
8 ret = json.dumps(v4) 9 print(ret)

dump 和 load(文件操做相關)

 

 1 import json  2 f = open('json_file','w')  3 dic = {'k1':'v1','k2':'v2','k3':'v3'}  4 json.dump(dic,f)  5 f.close()  6 接收一個文件句柄,直接將字典轉換成json字符串寫入  7 
 8 import json  9 f = open('json_file','r') 10 dic2 = json.load(f) 11 f.close() 12 print(dic2,type(dic2)) 13 接收一個文件句柄,直接將文件中的json字符串轉換成字典的數據結構返回

 

總結:
# json.load() #參數文件句柄(r), 將文件中字符串轉換成字典
# json.dump() #對象(字典),文件句柄(w) 將字典轉換字符串寫入到文件中
# json.dumps() #對象(字典) 將字典轉換成字符串
# json.loads() #字符串(字典) 將字符串轉換成字典

json的格式化輸出
1 import json 2 data = {'username':['李華','二愣子'],'sex':'male','age':16} 3 json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) 4 print(json_dic2)

結果:

1 { 2   "age":16, 3   "sex":"male", 4   "username":[ 5     "李華", 6     "二愣子"
7  ] 8 }

pickle模塊只用於Python編譯器

不只能夠序列化字典,列表...能夠把python中任意的數據類型序列化

1 import pickle 2 print(pickle.dumps({'1':4}))   #將對象轉換成相似二進制的東西
3 print(pickle.loads(b'\x80\x03}q\x00X\x01\x00\x00\x001q\x01K\x04s.')) 4 #將一個堆相似於二進制的東西轉換成字典
5 
6 pickle.dump({'2':4},open('b','wb')) 7 d = pickle.load(open('b','rb')) 8 print(d)
總結:
josn,pickle 對比:

loads json裏的將字符串轉換成字典 pickle 將字節轉換成字典
dumps json裏的將字典轉換成字符串 pickle 將字典轉換成字節
load json裏的將文件中的字符串轉換成字典 pickle 將文件中的字節轉換成字典
dump json裏的將字典轉換字符串寫入到文件中,pickle 將字典轉換成字節寫入到文件中

shelve模塊

1 import shelve 2 f = shelve.open('c',writeback=True) #建立文件 # writeback = True 回寫
3 f['name'] = 'alex'
4 f['age'] = 18
5 print(f['name'],f['age'])
7 print(f)  # 這樣是查看不了字典
8 
9 for i in f: 10     print(i)   #獲取到全部的鍵
11
12 print(f.keys())  #keys也不行
13 
14 for i in f: 15     print(f[i])  #獲取到全部的值

2、random 模塊:  隨機數模塊

1 獲取0-1之間的隨機小數 2 import random 3 print(random.random())

 

1 獲取指定範圍的隨機小數 2 import random 3 print(random.uniform(1,5))

 

1 獲取範圍內的隨機整數 2 import random 3 print(random.randint(1,5)) 4 # 起始位置,終止位置 兩頭都包含

 

1 獲取範圍內的隨機奇數和偶數: 2 import random 3 print(random.randrange(1,5,2))   #隨機生成1-5的奇數
4 print(random.randrange(0,5,2))   #隨機生成0-5的偶數
5 #起始位置,終止位置(不包含),步長

 

1 print(random.choice(['alex','wusir','eva_j'])) 2 從有序數據結構中隨機選擇一個

 

1 print(random.choices(['wusir','tialaing','taihei','ritian'],k=2)) 2 隨機選擇兩個,可是有重複

 

1 print(random.sample(['wusir','tialaing','taihei','ritian'],k=2)) 2 隨機選擇兩個,沒有重複

 主要應用場景:微信隨機紅包、驗證碼、隨機數:

 1 li = [1,2,3,4,6]  2 random.shuffle(li)  # 洗牌 打亂順序
 3 print(li)  4 
 5 print(chr(65),chr(90),chr(97),chr(122))  6 
 7 U = chr(random.randrange(65,91))  8 L = chr(random.randrange(97,123))  9 n1 = random.randrange(0,10) 10 n2 = random.randrange(0,10) 11 print(U, L,n1,n2)

微信搶紅包程序:

 1 import random  2 def red_pac(money,num):  3     ret = random.sample(range(1,money*100),num-1)  4  ret.sort()  5  ret.insert(0,0)  6     ret.append(money*100)  7     for i in range(len(ret)-1):  8         value = ret[i+1] - ret[i]  9         yield value/100
10 
11 g = red_pac(200,10) 12 for i in g: 13     print(i)

3、time模塊

 

①時間戳time.time()

 

②結構化時間time.localtime()

 

③字符串時間time.strftime()

1 時間戳 -- 結構化時間        #time.localtime()
2 結構化時間 -- 字符串時間    #time.strftime()
3 
4 字符串時間 -- 結構化時間    #time.strptime
5 結構化時間 -- 時間戳       #time.mktime()

例題:

1 t = '2019-03-20 10:40:00'
 2 把這個時間向後退一個月 3 # 1.轉成結構化
 4 f = time.strptime(t,'%Y-%m-%d %X') 5 # 2.結構化時間轉成時間戳
 6 ts = time.mktime(f) 7 # 3.將時間戳向大變
 8 new_ts = ts + 86400 * 30
 9 # 4.將最新的時間戳轉成結構化時間
10 new_f = time.localtime(new_ts) 11 # 5.將結構化時間轉成字符串時間
12 print(time.strftime('%Y-%m-%d %X',new_f)) 13 
14 獲取當前時間求前一月的如今時間 15 1.獲取時間戳進行減法計算 16 new_ts = time.time() - 30*86400
17 # 2.最新的時間戳轉成結構化時間
18 new_f = time.localtime(new_ts) 19 # 3.將結構化時間轉成字符串時間
20 print(time.strftime('%Y-%m-%d %X',new_f))

 

4、os模塊:主要和當前電腦操做系統作交互

os模塊與文件夾相關:
1 import os 2 os.makedirs('app/a/b/c')    # 遞歸建立文件 ***
3 os.removedirs('app/a/b/c')  # 遞歸刪除文件, 當這個要刪除的目錄有文件就中止刪除 ***
4 os.mkdir('app')         # 建立單個目錄 ***
5 os.rmdir('app')          # 刪除單個目錄,目錄若是有東西就報錯不進行刪除 ***
6 print(os.listdir('D:\PyCharmProject\s20\day14'))    
#查看某個目錄下的內容****
 

os模塊和文件相關:

1 os.remove()   #刪除這個文件,刪除了就不能恢復了 *****
2 os.rename()   #修改文件的名字 *****

與操做系統相關:

1 print(repr(os.sep))  #\\
2 C:\Users\lucky\Documents\Tencent Files\932023756\FileRecv 3 路徑符號
 
1 print(os.popen('dir').read())               ***
2 #在寫程序的時候能夠下發一些操做系統的指令
3 #在linux系統上至關於發shell命令
4 os.environ  獲取系統環境變量

與path執行路徑相關

 1 print(os.path.abspath('b'))      ****
 2 獲取當前文件的絕對路徑  3 print(os.path.split(r'D:\PyCharmProject\s20\day14\b'))  4 將這個文件的絕對路徑分紅目錄和文件  5 print(os.path.basename(r'D:\PyCharmProject\s20\day14\b'))  **
 6 獲取的是這個文件的名字  7 print(os.path.dirname(r'D:\PyCharmProject\s20\day14\b'))   ***
 8 獲取的是這個文件的目錄路徑  9 print(os.path.exists(r'D:\PyCharmProject\s20\day10\07 今日總結.py')) **
10 判斷這個文件是否存在 11 print(os.path.isabs(r'D:\PyCharmProject\s20\day14\b')) 12 判斷是不是絕對路徑 13 
14 print(os.path.join('C:\\','app','a','b'))                 *****
15 #路徑拼接的 軟件開發規範 框架
16 
17 os.stat() 18 
19 print(os.stat('b').st_size)   #獲取文件大小 ,坑目錄 ***
20 print(os.getcwd())  # 獲取工做路勁 ***
21 
22 os.chdir('D:\PyCharmProject\s20\day13')  # 路勁切換 *
23 print(os.getcwd())

5、sys模塊:Python交互解釋器交互的

import sys

 1 print(sys.argv[-1])       ***
 2 接受cmd方式調用 後邊的參數會傳遞進來  3 linux系統上  -- 後端開發 -- 數據庫(文件) ip + 端口  4 
 5 print(sys.path)   # 添加自定義模塊路徑的 # ******
 6 
 7 print(sys.version)  # 版本 獲取解釋的版本號
 8 
 9 sys.platform = 'win1988'
10 
11 print(sys.platform)   #獲取當前操做系統的平臺位數 # 可進行修改的
12 
13 print(sys.exit(1))

 6、hashlib

應用:①密文形式存儲用戶登陸密碼信息;

   ②利用其不可逆不可改的特性驗證數據是否被篡改。

1 import hashlib 2 md5 = hashlib.md5(''.encode('utf-8'))  # 選擇加密方式 加鹽
3 md5.update('alex3714'.encode('utf-8')) # 將輸入的明文轉成字節而後進行加密
4 print(md5.hexdigest())    # 打印生成的密文
 
1 user,pwd = input('user|pwd:').strip().split('|') 2 import hashlib 3 
4 md5 = hashlib.md5(str(user).encode('utf-8')) 5 md5.update(pwd.encode('utf-8')) 6 print(md5.hexdigest())
以用戶名做爲加密方式:
1
user,pwd = input('user|pwd:').strip().split('|') 2 import hashlib 3 4 md5 = hashlib.md5(str(user).encode('utf-8')) 5 md5.update(pwd.encode('utf-8')) 6 print(md5.hexdigest())

加密方式除了md5還有sha1,sha256,sha512,其md5以及被破解,但sha系列的hash算法還很安全。

利用hashlib算法完成登陸和註冊頁面的需求: 

 1 hashlib 註冊系統  2 import hashlib  3 def md5(username,password):  4     md5 = hashlib.md5(username[::-1].encode('utf-8'))  5     md5.update(password.encode('utf-8'))  6     return md5.hexdigest()  7 
 8 def get_line():  9     with open('userinfo', encoding='utf-8') as f: 10         for line in f: 11             user, pwd = line.strip().split(',') 12             yield user,pwd 13 
14 def register(): 15     flag = True 16     while flag: 17         username = input('user :') 18         password = input('passwd :') 19         for user,pwd in get_line(): 20             if user == username: 21                 print('您輸入的用戶名已經存在') 22                 break
23         else: 24             flag = False 25     password = md5(username,password) 26     with open('userinfo',encoding='utf-8',mode='a') as f: 27         f.write('%s,%s\n'%(username,password))

 登陸系統
1
def login(): 2 username = input('user :') 3 password = input('passwd :') 4 for user,pwd in get_line(): 5 if username == user and pwd == md5(username,password): 6 return True 7 8 ret = login() 9 if ret: 10 print('登錄成功')

 7、re模塊

8、shutil模塊  :刪除文件夾(包括文件夾內的文件,)

1 import shutil 2 
3 shutil.rmtree(path)

 

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 """
 4 讓用戶執行腳本傳入要刪除的文件路徑,在內部幫助用將目錄刪除。  5 C:\Python36\python36.exe D:/code/s21day14/7.模塊傳參.py D:/test  6 C:\Python36\python36.exe D:/code/s21day14/7.模塊傳參.py  7 """
 8 import sys  9 
10 # 獲取用戶執行腳本時,傳入的參數。
11 # C:\Python36\python36.exe D:/code/s21day14/7.模塊傳參.py D:/test
12 sys.argv = ["D:/code/s21day14/7.模塊傳參.py", "D:/test"] 13 path = sys.argv[1] 14 
15 # 刪除目錄
16 import shutil 17 
18 shutil.rmtree(path)

 

9、getpass模塊(密碼不顯示,在終端運行)

1 import getpass 2 
3 pwd = getpass.getpass('請輸入密碼:') 4 if pwd == '123': 5     print('輸入正確')
相關文章
相關標籤/搜索