模塊

序列化
  • 定義:把一個數據類型轉換成 字符串、byets類型的過程就是序列化用途:1.須要把一個數據類型存儲在文件中2.須要把一個數據類型經過網絡傳輸的時候
1 import json 2 stu = {'name':'何青松','sex':'male'} 3 ret = json.dumps(stu)  # 序列化的過程
4 print(stu,type(stu))#{'name': '何青松', 'sex': 'male'} <class 'dict'>
5 print(ret,type(ret))#{"name": "\u4f55\u9752\u677e", "sex": "male"} <class 'str'>
6 d = json.loads(ret)    # 反序列化的過程
7 print('d-->',d,type(d))#d--> {'name': '何青松', 'sex': 'male'} <class 'dict'>
1 lst = [1,2,3,4,'aaa','bbb'] 2 ret = json.dumps(lst)  # 序列化的過程
3 print(lst,type(lst))#[1, 2, 3, 4, 'aaa', 'bbb'] <class 'list'>
4 print(ret,type(ret))#[1, 2, 3, 4, "aaa", "bbb"] <class 'str'>
5 d = json.loads(ret)    # 反序列化的過程
6 print('d-->',d,type(d))#d--> [1, 2, 3, 4, 'aaa', 'bbb'] <class 'list'>
 
json
優勢

全部的語言都通用
缺點
只支持很是少的數據類型
對數據類型的約束很苛刻
字典的key必須是字符串,且全部的字符串都必須是用''表示
只支持:數字 字符串 列表 字典
1 反面教材:因爲字典的key是數字1,通過序列化和反序列化後變成‘12 stu = {'name':'何青松','sex':'male',1:('a','b')} 3 ret = json.dumps(stu)  # 序列化的過程
4 print(ret,type(ret))#{"name": "\u4f55\u9752\u677e", "sex": "male", "1": ["a", "b"]} <class 'str'>
5 d = json.loads(ret)    # 反序列化的過程
6 print('d-->',d,type(d))#d--> {'name': '何青松', 'sex': 'male', '1': ['a', 'b']} <class 'dict'>
 
1 import json 2 dic = {'name':'何青松','sex':'male'} 3 str_dir1 = json.dumps(dic,ensure_ascii=False)#加上ensure_ascii=False,爲了正常寫入中文
4 str_dir2 = json.dumps(dic) 5 print(str_dir1)#{"name": "何青松", "sex": "male"} 6 print(str_dir2)#{"name": "\u4f55\u9752\u677e", "sex": "male"} 7 with open('json_file','w',encoding='utf-8') as f: 8     f.write(str_dir1)
能不能屢次向一個文件中dump,能夠,可是不能屢次load。
 1 dic = {'name':'何青松','sex':'male'}  2 with open('json_file','w',encoding='utf-8') as f:  3     json.dump(dic,f,ensure_ascii=False)  4     json.dump(dic,f,ensure_ascii=False)  5     json.dump(dic,f,ensure_ascii=False)  6     json.dump(dic,f,ensure_ascii=False)  7     json.dump(dic,f,ensure_ascii=False)  8 
 9 with open('json_file','r',encoding='utf-8') as f: 10     dic = json.load(f)#JSONDecodeError: Extra data: line 1 column 31 (char 30)
方法 dump load 這兩個方法 是徹底和文件打交道的 2 dic = {'name':'何青松','sex':'male'} 3 with open('json_file','w',encoding='utf-8') as f: 4     json.dump(dic,f,ensure_ascii=False) 5 
6 with open('json_file','r',encoding='utf-8') as f: 7     dic = json.load(f) 8 print(dic,dic['name'])

 







 1 我有需求向文件中寫入多個字典,用dumps和loads。  2 def my_dumps(dic):  3     with open('json_file', 'a', encoding='utf-8') as f:  4         dic_str = json.dumps(dic)  5         f.write(dic_str + '\n')  6 dic1 = {'name':'何青松','sex':'male'}  7 dic2 = {'name':'關亮何','sex':'male'}  8 dic3 = {'name':'何思浩','sex':'male'}  9 my_dumps(dic1) 10 my_dumps(dic2) 11 my_dumps(dic3) 12 with open('json_file','r',encoding='utf-8') as f: 13     for line in f: 14         dic = json.loads(line.strip()) 15         print(dic['name'])
json格式化
sort_keys:將數據根據keys的值進行排序。
indent:應該是一個非負的整型,若是是0,或者爲空,則一行顯示數據,
不然會換行且按照indent的數量顯示前面的空白,這樣打印出來的json數據也叫pretty-printed json
separators:分隔符,其實是(item_separator, dict_separator)的一個元組,默認的就是(‘,’,’:’);
這表示dictionary內keys之間用「,」隔開,而KEY和value之間用「:」隔開。
1 import json 2 data = {'username':['李華','二愣子'],'sex':'male','age':16} 3 json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False) 4 print(json_dic2)

 


pickle
1 import pickle 2 stu = {'name':'何青松','sex':'male',1:('a','b')} 3 ret = pickle.dumps(stu) 4 print(ret)#b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\t\x00\x00\x00\xe4\xbd\x95\xe9\x9d\x92\x
5 d = pickle.loads(ret) 6 print(d,type(d))#{'name': '何青松', 'sex': 'male', 1: ('a', 'b')} <class 'dict'>
 1 import pickle  2 class Course():  3     def __init__(self,name,price):  4         self.name = name  5         self.price = price  6 python = Course('python',29800)  7 linux = Course('linux',25800)  8 mysql = Course('mysql',18000)  9 ret = pickle.dumps(python) 10 print(ret)#b'\x80\x03c__main__\nCourse\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00
11 p = pickle.loads(ret) 12 print(p.name,p.price)#python 29800
13 with open('pickle_file','wb') as f: 14  pickle.dump(python,f) 15 with open('pickle_file','rb') as f: 16     course = pickle.load(f) 17 print(course.name)
 

 

操做文件文件必須以+b打開
在load的時候 若是這個要被load的內容所在的類不在內存中,會報錯
pickle支持屢次dump和屢次load(須要異常處理)
 1 import pickle  2 class Course():  3     def __init__(self,name,price):  4         self.name = name  5         self.price = price  6 python = Course('python',29800)  7 linux = Course('linux',25800)  8 mysql = Course('mysql',18000)  9 def my_dump(course): 10     with open('pickle','ab') as f: 11  pickle.dump(course,f) 12 my_dump(python) 13 my_dump(linux) 14 my_dump(mysql) 15 with open('pickle','rb') as f: 16     while True: 17         try: 18             content = pickle.load(f) 19             print(content.name) 20         except EOFError: 21             break
時間模塊

三種格式
時間戳時間 浮點數 秒爲單位
1970.1.1 0:0:0 英國倫敦時間
1970.1.1 8:0:0 東8區
結構化時間 元組
格式化時間 str數據類型的 node

1 fmt1 =time.strftime('%H:%M:%S') 2 fmt2 =time.strftime('%Y-%m-%d') 3 fmt3 =time.strftime('%y-%m-%d') 4 fmt4 =time.strftime('%c') 5 print(fmt1)#15:30:12
6 print(fmt2)#2018-09-04
7 print(fmt3)#18-09-04
8 print(fmt4)#Tue Sep 4 15:30:12 2018

str_time = '2018-8-8' struct_time = time.strptime(str_time,'%Y-%m-%d') print(struct_time)#time.struct_time(tm_year=2018, tm_mon=8, tm_mday=8, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=220, tm_isdst=-1)
timestamp = time.mktime(struct_time) print(timestamp)#1533657600.0

 

timestamp = 1500000000 struct_time = time.localtime(timestamp) fmt_time = time.strftime('%Y-%m-%d %H:%M:%S',struct_time) print(fmt_time)#2017-07-14 10:40:00

 

寫函數,計算本月1號的時間戳時間
經過我拿到的這個時間,能迅速的知道我如今所在時間的年 月
1 def get_timestamp(): 2     fmt_time = time.strftime('%Y-%m-1') 3     struct = time.strptime(fmt_time,'%Y-%m-%d') 4     res = time.mktime(struct) 5     return res 6 ret = get_timestamp() 7 print(ret)

 

 隨機數模塊
1 import random 2 # 取隨機小數 *
3 print(random.random())   #(0,1)
4 print(random.uniform(2,3))  #(n,m)
5 
6 # 取隨機整數 ****
7 print(random.randint(1,2))  # [1,2],能夠去到1或者2
8 print(random.randrange(1,2))  # [1,2)取不到2
9 print(random.randrange(1,100,2))#取100之內的奇數
 
1 lst = [1,2,3,4,5,('a','b'),'cc','dd'] 2 ret = random.choice(lst)#隨機取一個
3 print(ret) 4 ret = random.choice(range(100)) 5 print(ret) 6 ret = random.sample(lst,3)#列表元素任意3個組合
7 print(ret)
1 # 亂序 ***
2 lst = [1,2,3,4,5,('a','b'),'cc','dd'] 3 random.shuffle(lst) 4 print(lst)

 搶紅包:python

 

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

驗證碼應用:mysql

每一位上出現的內容既能夠是數字 也能夠是字母
隨機生成一個數字 一個大寫字母 一個小寫字母
 1 def get_code(n):  2     code = ''
 3     for i in range(n):  4         num = str(random.randint(0,9))  5         alpha_upper = chr(random.randint(65, 90))  6         alpha_lower = chr(random.randint(97, 122))  7         c = random.choice([num,alpha_upper,alpha_lower])  8         code += c  9     return code 10 ret = get_code() 11 print(ret)

進階版linux

 1 def get_code(n = 6,alph_flag = True):  2     code = ''
 3     for i in range(n):  4         c = str(random.randint(0,9))  5         if alph_flag:  6             alpha_upper = chr(random.randint(65, 90))  7             alpha_lower = chr(random.randint(97, 122))  8             c = random.choice([c,alpha_upper,alpha_lower])  9         code += c 10     return code 11 ret = get_code() 12 print(ret)
OS模塊:
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.getcwd() 獲取當前工做目錄,即當前python腳本工做的目錄路徑 os.chdir("dirname") 改變當前腳本工做目錄;至關於shell下cd os.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.getatime(path) 返回path所指向的文件或者目錄的最後訪問時間 os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間 os.path.getsize(path) 返回path的大小
stat 結構: st_mode: inode 保護模式 st_ino: inode 節點號。 st_dev: inode 駐留的設備。 st_nlink: inode 的連接數。 st_uid: 全部者的用戶ID。 st_gid: 全部者的組ID。 st_size: 普通文件以字節爲單位的大小;包含等待某些特殊文件的數據。 st_atime: 上次訪問的時間。 st_mtime: 最後一次修改的時間。 st_ctime: 由操做系統報告的"ctime"。在某些系統上(如Unix)是最新的元數據更改的時間,在其它系統上(如Windows)是建立時間(詳細信息參見平臺的文檔)。  stat 結構
os.sep    輸出操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/"
os.linesep    輸出當前平臺使用的行終止符,win下爲"\r\n",Linux下爲"\n"
os.pathsep    輸出用於分割文件路徑的字符串 win下爲;,Linux下爲:
os.name    輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix'
1 print('-->cwd : ',os.getcwd()) 2 open('file','w').close() 文件在執行這個文件的目錄下建立了不是當前被執行的文件所在的目錄,而是執行這個文件所在的目錄  工做目錄在哪兒,全部的相對目錄文件的建立,都是在哪兒執行這個文件,就在哪兒建立,能夠用__file__規避
6 os.chdir('D:\騎士計劃PYTHON1期\day23')#切換到當前目錄
7 open('file3','w').close() 8 print('-->cwd : ',os.getcwd())

collections模塊

 

在內置數據類型(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個額外的數據類型:Counter、deque、defaultdict、namedtuple和OrderedDict等。算法

 

1.namedtuple: 生成可使用名字來訪問元素內容的tuplesql

 

2.deque: 雙端隊列,能夠快速的從另一側追加和推出對象shell

 

3.Counter: 計數器,主要用來計數json

 

4.OrderedDict: 有序字典安全

 

5.defaultdict: 帶有默認值的字典bash

 

使用dict時,Key是無序的。在對dict作迭代時,咱們沒法肯定Key的順序。

若是要保持Key的順序,能夠用OrderedDict

1 from collections import OrderedDict 2 dd = OrderedDict([('a',1),('k1','v1')]) 3 for k in dd: 4     print(k,dd[k]) 5 dd['k2'] = 'v2'
6 print(dd)

意,OrderedDict的Key會按照插入的順序排列,不是Key自己排序:

defaultdict 

有以下值集合 [11,22,33,44,55,66,77,88,99,90...],將全部大於 66 的值保存至字典的第一個key中,將小於 66 的值保存至第二個key的值中。

from collections import defaultdict values = [11, 22, 33,44,55,66,77,88,99,90] my_dict = defaultdict(list) for value in values: if value>66: my_dict['k1'].append(value) else: my_dict['k2'].append(value)

使dict時,若是引用的Key不存在,就會拋出KeyError。若是但願key不存在時,返回一個默認值,就能夠用defaultdict

>>> from collections import defaultdict >>> dd = defaultdict(lambda: 'N/A') >>> dd['key1'] = 'abc'
>>> dd['key1'] # key1存在
'abc'
>>> dd['key2'] # key2不存在,返回默認值
'N/A'
namedtuple
from collections import namedtuple birth = namedtuple('Struct_time',['year','month','day']) b1 = birth(2018,7,5) print(type(b1))#<class '__main__.Struct_time'> print(b1.year)#2018 print(b1.month) print(b1.day) print(b1)#Struct_time(year=2018, month=7, day=5) # 可命名元組很是相似一個只有屬性沒有方法的類 # ['year','month','day']是對象屬性名 # Struct_time是類 的名字 # 這個類最大的特色就是一旦實例化 不能修改屬性的值
 

 

deque
from collections import deque dq = deque() dq.append(1) dq.append(2) dq.appendleft(3)#從左增長
print(dq)#deque([3, 1, 2])
print(dq.pop())#2
print(dq.popleft())#3 從左邊刪
print(dq)#deque([1])
 
import queue q = queue.Queue()  # 隊列
q.put(1) q.put(2) q.put('aaa') q.put([1,2,3]) q.put({'k':'v'}) print(q.get())#1
print(q.get())#2
hashlib
摘要算法
它經過一個函數,把任意長度的數據轉換爲一個長度固定的數據串(一般用16進制的字符串表示)。
不一樣的字符串經過這個算法的計算獲得的密文老是不一樣的
相同的算法 相同的字符串 得到的結果老是相同的
注意:
1.文件操做 : f.readlines()浪費內存
2.md5_obj不能重複使用

hashlib 摘要算法
多種算法
md5算法 :32位16進制的數字字符組成的字符串
應用最廣大的摘要算法
效率高,相對不復雜,若是隻是傳統摘要不安全
sha算法 :40位的16進制的數字字符組成的字符串
sha算法要比md5算法更復雜
且shan n的數字越大算法越複雜,耗時越久,結果越長,越安全
算法不可逆

MD5算法:
舉例:
md5_obj = hashlib.md5() # md5_obj.update(b'alex3714')
md5_obj.update('999'.encode('utf-8')) ret = md5_obj.hexdigest() print(ret,type(ret),len(ret))

 

 
'hello,world'分段加密和一次加密效果同樣:
 
import hashlib md5_obj = hashlib.md5() md5_obj.update('hello,world'.encode('utf-8')) ret = md5_obj.hexdigest() print(ret)#3cb95cfbe1035bce8c448fcaf80fe7d9
 md5_obj = hashlib.md5() md5_obj.update('hello'.encode('utf-8')) md5_obj.update(',world'.encode('utf-8')) ret = md5_obj.hexdigest() print(ret)#3cb95cfbe1035bce8c448fcaf80fe7d9
 
 登陸驗證應用:
def get_md5(s): md5_obj = hashlib.md5() md5_obj.update(s.encode('utf-8')) ret = md5_obj.hexdigest() return ret usrname = input('username : ') passwd = input('password : ') with open('userinfo') as f: for line in f: usr,pwd = line.strip().split('|') if usrname == usr and get_md5(passwd) == pwd: print('登陸成功') break
    else: print('登陸失敗')
 

 

sha算法:
sha_obj = hashlib.sha512() sha_obj.update('alex3714'.encode('utf-8')) ret = sha_obj.hexdigest() print(len(ret),ret)
 
動態加鹽
每個用戶建立一個鹽 - 用戶名
def get_md5(user,s): md5_obj = hashlib.md5(user.encode('utf-8'))#加入用戶名 md5_obj.update(s.encode('utf-8')) ret = md5_obj.hexdigest() return ret print(get_md5('alex','alex3714'))
文件的一致性校驗應用:
import os import hashlib def get_file_md5(file_path,buffer = 1024): md5_obj = hashlib.md5() # file_path = r'3.習題講解2.mp4' # 路徑裏不能有空格
    file_size = os.path.getsize(file_path) with open(file_path,'rb') as f: while file_size: content = f.read(buffer)   # 1024 1024 1024 。。。 5
            file_size -= len(content) # 5 -=5
 md5_obj.update(content) return md5_obj.hexdigest() print(get_file_md5( r'3.習題講解2.mp4'))
 

logging模塊

 

import logging logging.basicConfig(level=logging.INFO) logging.debug('debug message')    # 計算或者工做的細節
logging.info('info message')      # 記錄一些用戶的增刪改查的操做
logging.warning('input a string type') # 警告操做
logging.error('error message')     # 錯誤操做
logging.critical('critical message')  # 批判的 直接致使程序出錯退出的

 

# 簡單配置
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%c', filename='test.log') logging.warning('input a string type') # 警告操做
logging.error('EOF ERROR ') # 警告操做
logging.info('小明買了三斤魚') # 警告操做
# 對象的配置
    # 解決中文問題
    # 同時向文件和屏幕輸出內容

# 先建立一個log對象 logger
logger = logging.getLogger() logger.setLevel(logging.DEBUG) # 還要建立一個控制文件輸出的文件操做符
fh = logging.FileHandler('mylog.log',encoding='utf-8') # 還要建立一個控制屏幕輸出的屏幕操做符
sh = logging.StreamHandler() # 要建立一個格式
fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fmt2 = logging.Formatter('%(asctime)s - %(name)s[line:%(lineno)d] - %(levelname)s - %(message)s') # 文件操做符 綁定一個 格式
fh.setFormatter(fmt) # 屏幕操做符 綁定一個 格式
sh.setFormatter(fmt2) sh.setLevel(logging.WARNING) # logger對象來綁定:文件操做符, 屏幕操做符
logger.addHandler(sh) logger.addHandler(fh)
相關文章
相關標籤/搜索