logging模塊.
collections模塊.
time模塊.
random模塊.
logging 模塊
logging 日誌
記錄.花錢的,(淘寶)敗家的,
訪問的記錄,
員工信息,debug等等都須要日誌.
1,被動觸發: 與異常處理配合.訪問記錄.
2, 主動觸發:檢測運維人員輸入的指令,檢測服務器的重要信息,訪問記錄.等等.
高配版:
# 初版:只輸入文件中. # import logging # logger = logging.getLogger() # 建立logger對象. # fh = logging.FileHandler('高配版logging.log',encoding='utf-8') # 建立文件句柄 # # # 吸星大法 # logger.addHandler(fh) # # logging.debug('debug message') # logging.info('info message') # logging.warning('warning message') # logging.error('error message') # logging.critical('critical message') # 第二版:文件和屏幕都存在. # import logging # logger = logging.getLogger() # 建立logger對象. # fh = logging.FileHandler('高配版logging.log',encoding='utf-8') # 建立文件句柄 # sh = logging.StreamHandler() #產生了一個屏幕句柄 # # # 吸星大法 # logger.addHandler(fh) #添加文件句柄 # logger.addHandler(sh) #添加屏幕句柄 # # # logging.debug('debug message') # logging.info('info message') # logging.warning('warning message') # logging.error('error message') # logging.critical('critical message') # 第三版:文件和屏幕都存在的基礎上 設置顯示格式. # import logging # logger = logging.getLogger() # 建立logger對象. # fh = logging.FileHandler('高配版logging.log',encoding='utf-8') # 建立文件句柄 # sh = logging.StreamHandler() #產生了一個屏幕句柄 # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # # # # 吸星大法 # logger.addHandler(fh) #添加文件句柄 # logger.addHandler(sh) #添加屏幕句柄 # sh.setFormatter(formatter) # 設置屏幕格式 # fh.setFormatter(formatter) # 設置文件的格式 (這兩個按照需求能夠單獨設置) # # # logging.debug('debug message') # logging.info('info message') # logging.warning('warning message') # logging.error('error message') # logging.critical('critical message') #第四版 文件和屏幕都存在的基礎上 設置顯示格式.而且設置日誌水平. # import logging # logger = logging.getLogger() # 建立logger對象. # fh = logging.FileHandler('高配版logging.log',encoding='utf-8') # 建立文件句柄 # sh = logging.StreamHandler() #產生了一個屏幕句柄 # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # # logger.setLevel(logging.DEBUG) # #若是你對logger對象設置日誌等級.那麼文件和屏幕都設置了. # #總開關 默認從warning開始,若是想設置分開關:必需要從他更高級:(ERROR,critical)從這來個開始. # # # 吸星大法 # logger.addHandler(fh) #添加文件句柄 # logger.addHandler(sh) #添加屏幕句柄 # sh.setFormatter(formatter) # 設置屏幕格式 # fh.setFormatter(formatter) # 設置文件的格式 (這兩個按照需求能夠單獨設置) # fh.setLevel(logging.DEBUG) # # logging.debug('debug message') # logging.info('info message') # logging.warning('warning message') # logging.error('error message') # logging.critical('critical message')
collections模塊html
collections 模塊給你提供的就是一些特殊的數據類型. namedtuple # 能夠定位一個座標 tu = (1,2) print(tu[0],tu[1]) from collections import namedtuple point = namedtuple('Point',['x','y']) p = point(10,30) # p = (x=10,y=30) print(p.x) print(p.y) print(p[0]) print(p[1]) deque 雙端隊列 from collections import deque q = deque(['a','b','c','d','e']) print(q) q.append(666) #添加最右邊 q.append(777) q.appendleft(111) #從最左邊添加 q.appendleft(222) q.pop() # 從右邊刪除 q.popleft() # 從左邊刪除 q.popleft() print(q) queue隊列 原則:先進先出.fifo 棧: 先進後出.
OrderedDict 按照鍵的添加值得順序進行排列 dic = {} dic['name'] = 'alex' dic['age'] = '1000' dic['sex'] = '男' print(dic) from collections import OrderedDict # od = OrderedDict() # od['name'] = 'alex' # od['age'] = '1000' # od['sex'] = '男' # print(od) 裝逼版: d = dict([('a', 1), ('b', 2), ('c', 3)]) print(d) from collections import OrderedDict od1 = OrderedDict([('a', 1), ('c', 3), ('b', 2),]) print(od1) l1 = [11,22,33,44,55,77,88,99,90] dic = {} for i in l1: if i > 66: if 'key1' not in dic: dic['key1'] = [] dic['key1'].append(i) else: if 'key2' not in dic: dic['key2'] = [] dic['key2'].append(i) print(dic)
##defaultDict(能夠被調用的) 給這個字典的全部的鍵配一個默認的值
from collections import defaultdict l1 = [11, 22, 33,44,55,66,77,88,99,90] my_dict = defaultdict(list) my_dict['key1'] my_dict['key2'] print(my_dict) my_dict = defaultdict(list) for value in l1: if value>66: my_dict['k1'].append(value) else: my_dict['k2'].append(value) print(my_dict) dic1 = {} #---> dic1={1:5,2:5,3:5.....20:5}
格外一個題 ------------------------------------------- for i in range(1,21): dic1[i] = 5 print(dic1) dic1 = {x:5 for x in range(1,21)} dic1 = dict.fromkeys(range(1,21),5)
------------------------------------------------- Counter 自動計數
dic1 = defaultdict(lambda :5) for i in range(1,21): dic1[i] print(dic1) from collections import Counter c = Counter('abcdeabcdabcabafkjdslajlkfd') print(c) 自動計算 a 有多少個 b有多少個 c 有多少個
random模塊node
#隨機的python
import random print(random.random()) # 0~1 之間的小數 print(random.uniform(1,3)) # 1~3小數 print(random.randint(1,5)) # 1<=x<=5顧頭也顧尾 print(random.randrange(1,10,2)) # 1<=x<10 的奇數 顧首不顧尾 print(random.choice({1,'23',2,3})) # 任選一個 經常使用 print(random.choice('fdsjafdsfgdsagfdsa')) # 任選一個 經常使用 random.sample([1,1,1,1,1,6,7,8,9,10],2) # #列表元素任意2個組合 item = [i for i in range(1,14)] random.shuffle(item) # 打亂順序 print(item)
時間模塊 time模塊正則表達式
① 時間戳:測試執行效率 , 一般來講,時間戳表示的是從 1970年1月1日 00:00:00開始按秒計算的偏移量.shell
咱們運行 "type(time.time())" ,返回的是float類型django
print(time.time()) #當前的時間戳瀏覽器
print(time.sleep(2)) 停滯2秒 * bash
② 格式化時間: strftime() *服務器
表示時間,供人類看的app
print(time.strftime('%Y-%m-%d %H:%M:%S')) #打印當前的年月日時間
print(time.strftime('%Y - %m - %d %H:%M:%S'),type(time.strftime('%Y - %m - %d %H:%M:%S'))) #打印當前的時間,並判斷是什麼類型
ret = time.strftime('%Y{}%m{}%d{} %H:%M:%S').format('年','月',';日) #打印出來的是帶年月日三個字的時間段
%y 兩位數的年份表示(00-99) %Y 四位數的年份表示(000 - 9999) %m 月份(01-12) %d 月內中的一天(0-31) %H 24小時制小時數(0-23) %I 12小時制小時數(01-12) %M 分鐘數 (00 - 59) %S 秒(00 - 59) %a 本地簡化星期名稱 %A 本地完整星期名稱 %b 本地簡化的月份名稱 %B 本地完整的月份名稱 %c 本地相應的日期表示和時間表示 %j 年內的一天(001-366) %p 本地A.M.或P.M.的等價福 %U 一年中的星期數 (00 -53) 星期天爲星期的開始 %w 星期(0 -6),星期天爲星期的開始 %W 一年中的星期數(00 -53 ) 星期一爲星期的開始 %x 本地相應的日期表示 %X 本地相應的時間表示 %z 當前時區的名稱 %% %號自己 python中時間日期格式化符號:
③結構化時間(時間戳與字符串時間中間介質) localtime()
元組(struct_time) :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等)
索引(index) | 屬性(Attribute) | 值(Values) |
0 | tm_year(年) | 好比2011 |
1 | tm_mon(月) | 1- 12 |
2 | tm_mday(日) | 1-31 |
3 | tm_hour(時) | 0 -23 |
4 | tm_min (分) | 0-59 |
5 | tm_sec (秒) | 0-60 |
6 | tm_wday(weekday) | 0-6(0表示週一) |
7 | tm_yday(一年中的第幾天) | 1- 366 |
8 | tm_isdst(是不是夏令時) | 默認爲0 |
ret = time.localtime() #獲得結構化時間
print(ret)
print(time.gmtime()) #倫敦時區的結構化時間
##導入時間模塊 import time ##時間戳 time.time() ##時間字符串 >>>time.strftime("%Y-%m-%d %X") '2017-07-24 13:54:37' >>>time.strftime("%Y-%m-%d %H-%M-%S") '2017-07-24 13-55-04' #時間元組:localtime將一個時間戳轉換爲當前時區的struct_time time.localtime() time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=13, tm_min=59, tm_sec=37, tm_wday=0, tm_yday=205, tm_isdst=0)
小結:時間戳是計算機可以識別的時間;時間字符串是人可以看懂的時間;元組則是用來操做時間的
幾種格式之間的轉換
##格式化時間 ---> 結構化時間 ft = time.strftime('%Y/%m/%d %H:%M:%S') st = time.strptime(ft,'%Y/%m/%d %H:%H:%S') print(st) ##結構化 ---> 時間戳 t = time.mktime(st) print(t) ##時間戳 ---> 結構化時間 t =time.time() st = time.localtime(t) print(st) ##結構化時間 --->格式化時間 ft = time.strftime('%Y/%m%d %H:%M:%S',st) print(ft)
##結構化時間 ---> %a %b %d %H:%M:%S %Y串 #time.asctime(結構化時間) 若是不傳參數,直接返回當前時間的格式化串 >>>time.asctime(time.localtime(1500000000)) 'Fri Jul 14 10:40:00 2017' >>>time.asctime() 'Mon Jul 24 15:18:33 2017' #時間戳 --> %a %d %d %H:%M:%S %Y串 #time.ctime(時間戳) 若是不傳參數,直接返回當前時間的格式化串 >>>time.ctime() 'Mon Jul 24 15:19:07 2017' >>>time.ctime(1500000000) 'Fri Jul 14 10:40:00 2017' t = time.time() ft = time.ctime(t) print(ft) st = time.localtime() ft = time.asctime(st) print(ft)
os模塊
os模塊是與操做系統交互的一個接口
#當前執行這個python文件的工做目錄相關的工做路徑 os.getcwd() 獲取當前工做目錄,即當前python腳本工做的目錄路徑 os.chdir("dirname") 改變當前腳本工做目錄;至關於shell下cd os.curdir 返回當前目錄: ('.') os.pardir 獲取當前目錄的父目錄字符串名:('..') #和文件夾相關 os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄 os.removedirs('文件夾') 若目錄爲空,則刪除,並遞歸到上一級目錄,如若也爲空,則刪除,依此類推 os.mkdir('文件夾') 生成單級目錄;至關於shell中mkdir dirname os.rmdir('文件夾') 刪除單級空目錄,若目錄不爲空則沒法刪除,報錯;至關於shell中rmdir dirname os.listdir('dirname') 列出指定目錄下的全部文件和子目錄,包括隱藏文件,並以列表方式打印 # 和文件相關 os.remove() 刪除一個文件 os.rename("oldname","newname") 重命名文件/目錄 os.stat('文件名') 獲取文件/目錄信息 # 和操做系統差別相關 os.sep 輸出操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/" os.linesep 輸出當前平臺使用的行終止符,win下爲"\t\n",Linux下爲"\n" os.pathsep 輸出用於分割文件路徑的字符串 win下爲;,Linux下爲: os.name 輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix' # 和執行系統命令相關 os.system("bash command") 運行shell命令,直接顯示 os.popen("bash command).read() 運行shell命令,獲取執行結果 os.environ 獲取系統環境變量 #path系列,和路徑相關 os.path.abspath(文件名) 返回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的大小
個別例子:↓
# path系列,和路徑相關
# p1 = os.path.abspath('04 os 模塊.py') # 獲取本文件的絕對路徑 *
# print(os.path.split(os.path.abspath('04 os 模塊.py'))) # 將path分割成目錄和文件名二元組返回 *
# print(os.path.split('E:\\sylar\\python_workspace\\day27')) # 將path分割成目錄和文件名二元組返回
# print(os.path.dirname(os.path.abspath('04 os 模塊.py'))) #返回工做目錄
# print(os.path.basename(os.path.abspath('04 os 模塊.py'))) # 經過絕對路徑返回當前的文件名
# print(os.path.exists('E:\\sylar\\python_workspace\\day27'))
# print(os.path.exists('E:\\sylar\\python_workspace\\day28'))
print(os.path.join('E:\\sylar\\python_workspace', '\\day28', '\\day29')) # * 拼接路徑
# print(os.path.getsize('E:\\sylar\\python_workspace\\day27\\04 os 模塊.py'))
注意:os.stat('path/filename')獲取文件/目錄信息的結構說明
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)是建立時間(詳細信息參見平臺的文檔)。
sys 模塊
sys模塊是與python解釋器交互的一個接口
sys.argv 命令行參數List,第一個元素是程序自己路徑 sys.exit(n) 退出程序,正常退出時exit(0),錯誤退出sys.exit(1) sys.version 獲取Python解釋程序的版本信息 sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值 sys.platform 返回操做系統平臺名稱
re 模塊下的經常使用方法
import re ret = re.findall('a','eva egon yuan') ##返回全部知足匹配條件的結果,放在列表裏 print(ret) #結果 :['a','a'] ret = re.search('a','eva egon yuan').group() print(ret) ##結果: 'a' ##函數會在字符串內查找模式匹配,只找到第一個匹配而後返回一個包含匹配信息的對象,該對##象能夠經過 group()方法獲得匹配的字符串,若是字符串沒有匹配,則返回None. ret = re.match('a','abc').group() ##match默認前面會有一個 ^ print(ret) ##同search ,不過盡在字符串開始處進行匹配 結果:'''a''' ret = re.split('[ab]','abcd') #先按'a' 分割獲得 ' ' 和'bcd',在對' '和'bcd'分別按 'b'分割 print(ret) ## [' ', ' ','cd'] ret = re.sub('\d','H','eva3egon4yuan4',1) ##將數字替換成'H',參數1表示只替換1個 print(ret) ##evaHegon4yuan4 ret = re.subn('\d','H','eva3egon4yuan4') #將數字替換成'H' ,返回元組(替換的結果,替換了多少次) print(ret) ##('evaHegonHyuanH', 3) obj = re.compile('\d{3}') ##將正則表達式編譯稱爲一個 正則表達式對象,規則要匹配的是3個數字 ret = obj.search('abc123eeee') #正則表達式對象調用search,參數爲待匹配的字符串 print(ret.group()) ##結果:123 import re ret = re.finditer('\d','ds3sd1321a') #finditer 返回一個存放匹配結果的迭代器 print(ret) ##<callable_iterator object at 0x10195f940> print(next(ret).group()) ##查看第一個結果 print(next(ret).group()) ##查看第二個結果 print([i.group() for i in ret ])) ##查看剩餘的左右結果
# 模塊 ****
# 什麼是模塊?
# py文件
# c語言編譯以後的文件
# 寫好的代碼集合 直接調用它的功能
# import time
# time.sleep()
# 爲何要有模塊?
# 內存空間是有限的,存放在硬盤裏,當你須要的時候加載到個人內存
# 把豐富的功能封裝在一個文件裏,等用的時候直接導入內存就能夠使用
# 有哪些種類的模塊?
# 內置模塊
# 擴展模塊
# django
# 安裝 : pip3 install 模塊名
# 自定義模塊
# 登陸
# 寫日誌
# 分模塊: 功能獨立\防止代碼過長
findall 和 分組的問題 import re # ret = re.findall('\d+(?:\.\d+)?','1.2345+4.3') # ?:寫在一個分組的最開始,表示在findall方法中取消這個分組的優先級 # 1.2345 4.3 # .2345 .3 # print(ret) # ret= re.search('\d+(\.\d+)?','1.2345+4.3') # print(ret.group()) # ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') # print(ret) # search # ret = re.match('\d+', 'hello,alex3714') # print(ret) # 'aa|bb'.split('|') # split中若是帶有分組,會在分割的同時保留被分割內容中帶分組的部分 # ret = re.split('(\d\d)','alex83wusir38egon20') # print(ret) # ret = re.sub('\d+','sb','alex83wusir38egon20',2) # print(ret) # ret = re.subn('\d+','sb','alex83wusir38egon20') # print(ret) # 節省時間 # obj = re.compile('\d{3}') #將正則表達式編譯成爲一個 正則表達式對象,規則要匹配的是3個數字 # print(obj) # ret = obj.search('abc123eeee') #正則表達式對象調用search,參數爲待匹配的字符串 # print(ret.group()) # ret = obj.search('abc444eeee') #正則表達式對象調用search,參數爲待匹配的字符串 # print(ret.group()) # finditer # 迭代功能的 # findall # 節省空間的 # ret = re.finditer('\d+','12aas14jsk38947cjhxj83') # print(ret) # for i in ret: # print(i.group()) # 基礎查找 findall(分組優先顯示) search match # 替換分割 split(分組保留) sub subn # 代碼優化 compile finditer # 分組命名 # html標籤語言 # html是一種代碼 # 對於瀏覽器來講 瀏覽器和代碼之間有一種約定 # 寫在一個標識符以內的代碼 能夠有一種獨立的格式 # 標識符 # <h1>sgjkagjgdjkf</h1> # 給分組起名字 (?P<tag>正則表達式),使用分組的名字(?P=tag) # ret = re.search('<(?P<tag>\w+?)>\w+</(?P=tag)>',"<b>hello</b>") # print(ret.group()) # print(ret.group('tag')) # 根據分組的索引使用分組 \1,1是分組的索引值 # ret = re.search(r'<(\w+?)>\w+</\1>',"<b>hello</b>") # print(ret.group()) # print(ret.group(1)) # ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>") # ret.group(1) # ret = re.finditer(r'<(\w+?)>\w+</\1>',"<b>hesakdfkhfkllo</b>") # for i in ret: # print(i.group(1)) # print(i.group())