模塊2

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())
相關文章
相關標籤/搜索