1 模塊介紹 2 Time&datetime 3 Random 4 Os 5 Sys 6 Shutil 7 Json & picle 8 Shelve 9 Xml處理 10 Yaml處理 11 Configparser 12 Hashlib 13 Subprocess 14 Logging 15 Re正則表達式
用來從邏輯上組織python代碼(變量,函數,類,邏輯:實現一個功能),本質就是.py結尾的python文件(文件名:文件名爲test.py,模塊名:test)python
用來從邏輯上組織模塊,本質是一個目錄(必須帶有一個__init__.py文件)。正則表達式
1 Import module_name 2 From module_name import * 3 From module_name import m1,m2,m3 4 From module_name import logger as logger_xxx #若是在改文件下有相同函數,重命名再調用。
1 Import module_name 至關於將module_name中module_name.py全部的代碼賦值給module_name調用; 2 From module_name import m1至關於已經定義了某個函數或者變量,直接使用。 3 導入模塊的本質就是把python文件解釋一遍。 4 導入一個程序包import 文件夾的本質就是執行該包下的__init__.py文件 5 導入不通目錄時添加路徑: 6 base = os.path.dirname(os.path.abspath(__file__)) 7 sys.path.append(base)
1 每次會去尋找mud.name,怎麼優化呢? 2 import mud 3 4 def all(): 5 mud.name() 6 print("這是number") 7 8 def search(): 9 mud.name() 10 print("這是search") 11 12 優化方案: 13 14 from mud import name 15 16 def all1(): 17 name() 18 print("這是number") 19 20 def search2(): 21 name() 22 print("這是search")
在Python中,一般有這幾種方式來表示時間: 1.時間戳 2.格式化的時間字符串 3.元組(struct_time) 共九個元素。因爲Python的time模塊實現主要調用C庫,因此各個平臺可能有所不一樣。 UTC(Coordinated Universal Time,世界協調時)亦即格林威治天問世間,世界標準時間。在 中國爲UTC+8。DST(Daylight Saving Time)中國夏令時。 時間戳(timestamp)的方式:一般來講,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。咱們運行「type(time.time())」,返回float類型。返回時間戳方式的函數主要有time(),clock()等。 元組(struct_time)方式:struct_time元組共有9個元素,返回struct_time的函數主要有gmtime(),localtime(),strptime().下面列出這種方式元組中的幾個元素: gmtime: >>> time.gmtime(31536000) time.struct_time(tm_year=1971, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec= 0, tm_wday=4, tm_yday=1, tm_isdst=0) time.localtime和time.mktime(x)間的轉換: >>> time.localtime() time.struct_time(tm_year=2017, tm_mon=10, tm_mday=27, tm_hour=10, tm_min=59, tm_ sec=41, tm_wday=4, tm_yday=300, tm_isdst=0) >>> x = time.localtime() >>> time.mktime(x) 1509073402.0 strftime: >>> x = time.localtime() >>> time.strftime("%Y-%m-%d %H:%M:%S",x) 解釋%Y == x.tm_year '2017-10-27 11:03:22' strptime: >>> time.strptime('2017-10-27 11:03:22',"%Y-%m-%d %H:%M:%S") time.struct_time(tm_year=2017, tm_mon=10, tm_mday=27, tm_hour=11, tm_min=3, tm_s ec=22, tm_wday=4, tm_yday=300, tm_isdst=-1) asctime: >>> time.asctime() 'Fri Oct 27 14:52:02 2017' >>> time.asctime((2017,12,10,14,12,10,10,3,10)) 'Thu Dec 10 14:12:10 2017' Ctime: >>> time.ctime() 'Fri Oct 27 14:56:55 2017' >>> time.ctime(100) 'Thu Jan 1 08:01:40 1970'
>>> datetime.datetime.now() datetime.datetime(2017, 10, 27, 15, 0, 56, 32101) #當前時間 >>> datetime.datetime.now()+datetime.timedelta(3) #修改時間到3天后 datetime.datetime(2017, 10, 30, 15, 1, 55, 331101) >>> datetime.datetime.now()+datetime.timedelta(-3) #修改時間到3天前 datetime.datetime(2017, 10, 24, 15, 2, 20, 788101) >>> datetime.datetime.now()+datetime.timedelta(hours=3) #修改時間到3小時後 datetime.datetime(2017, 10, 27, 18, 2, 55, 763101) >>> datetime.datetime.now()+datetime.timedelta(hours=-3) #修改時間到3小時前 datetime.datetime(2017, 10, 27, 12, 3, 13, 788101)
random.random() #用於生成一個0到1的隨機浮點數:0<= N <1.0 random.randint(1,4) #函數原型爲random.randint(a,b),用於生成一個指定範圍內的整數。結果指的是整數 random.randrange(10) #函數原型爲:random.randrange([start],stop[,step]); #從指定範圍內,按指定基數遞增的集合中獲取一個隨機數。如random.randrange(10,100,2)。結果指的是範圍 #random.randrange(10,100,2)在結果上與random.choice(range(10,100,2))等效。 random.choice('xxx') #random.choice從序列中獲取一個隨機元素。 #其函數原型爲:random.choice(sequence).參數sequence表示一個有序類型。 #這裏要說明下:sequence在python不是一種特定的類型,二十泛指一系列的類型。 #list,tuple,字符串都屬於sequence。有關sequence能夠查看python手冊數據模型一章。 random.sample([1,2,3],2) #random.sample的函數原型爲random.sample(sequence,k),從指定序列中隨機獲取指定長度的片斷,K不能超過總長度。 items = [1,2,3,4,5,6] #列表都是有順序的,怎麼讓他無序吶 random.shuffle(items) print(items) #能夠看見經過shuffle函數列表的順序變了 #簡單的隨機數字遊戲 #該列子加列表是爲了突出字符是循環單個組成的
#check = ''
check = []
for i in range(5):
num = random.randrange(5)
if num == i:
tmp = chr(random.randint(60,100))
else:
tmp = random.randint(0,9)
check.append(str(tmp))
print(check)
import os 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.sep #輸出操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/" os.linesep #輸出當前平臺使用的行終止符,win下爲"\t\n",Linux下爲"\n" os.pathsep #輸出用於分割文件路徑的字符串 os.name #輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix' os.system("bash command") #運行shell命令,直接顯示 os.environ #獲取系統環境變量 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('e','目錄名字') os.path.getatime(path) #返回path所指向的文件或者目錄的最後存取時間 os.path.getmtime(path) #返回path所指向的文件或者目錄的最後修改時間os.path.exists()
sys.argv #命令行參數List,第一個元素是程序自己路徑 sys.exit() #退出程序,正常退出時exit(0) sys.path #返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值 sys.version #獲取python的版本信息 sys.platform #返回操做系統平臺名稱
等待進度條:
1 for i in range(10): 2 sys.stdout.write('#') 3 sys.stdout.flush() 4 time.sleep(0.5)
shutil.copyfileobj(x,b) #複製文件x到b example: f11 = open('f1','r') f22 = open('f2','w') shutil.copyfileobj(f11,f22) f11.close() f22.close() shutil.copyfile('f1','f2') #直接寫入文件名字進行文件複製。 shutil.copymode('f1','f3') #根據當前用戶的umask接授權限。內容、組、用戶、均不變。 shutil.copystat('f1','f3') #使用copystat()只會複製與文件關聯的權限和日期。 shutil.copy(src,dst) #複製一個文件到一個文件或一個目錄。 shutil.copy2(src,dst) #在copy上的基礎上再複製文件最後訪問時間與修改時間也複製過來了,相似於cp –p的東西。 shutil.copytree( olddir, newdir, True/Flase) #把olddir拷貝一份newdir,若是第3個參數是True,則複製目錄時將保持文件夾下的符號鏈接,若是第3個參數是False,則將在複製的目錄下生成物理副原本替代符號鏈接。 shutil.rmtree('src') #刪除目錄。 shutil.make_archive(base_name,format,..) #shutil.make_archive('D:\\pythonl\\nn','zip','D:\\pythonl\\M') 將M這個目錄打包到指定目錄D:\\pythonl下,並起名爲nn.zip壓縮包 #建立壓縮包並返回文件路徑,例如:zip,tar #base_name:壓縮包的文件名,也能夠是壓縮包的路徑。只是文件名時,則保存至當前目錄,不然保存至指定路徑。 #如:www ==》 保存至當前路徑 #如:/user/www ==》保存至/User/xxx #format:壓縮包種類,‘zip’,‘tar’,‘bztar’,‘gztar’ #root_dir:要壓縮的文件夾路徑(默認當前目錄) #owner:用戶,默認當前用戶 #group:組,默認當前組 #logger:用於記錄日誌,一般是logging.logger對象
1 import zipfile 2 3 #壓縮文件 4 z = zipfile.ZipFile("11-1.zip","w") 5 6 z.write("f3") 7 z.write("f1") 8 9 z.close() 10 11 #解壓文件 12 z = zipfile.ZipFile("11-1.zip","r") 13 z.extractall() 14 z.close()
configParser 模塊用於操做配置文件,注:Parser漢譯爲「解析」之意。 import configparser config = configparser.ConfigParser() #建立ConfigParser實例 #第一種寫法 config['DEFAULT]'] = {'ServerAliveInterval':'45', 'Compression':'yes', 'CompressionLevel':'9', 'ForwardX11':'yes' } #第二種寫法 config['bitbucket.org'] = {} config['bitbucket.org']['User'] ='hg' config['topsecret.server.com']={} config['topsecret.server.com']['Port'] ='50022' config['topsecret.server.com']['ForwardX11'] ='no' #將上面內容寫入文件中 with open('f2','w') as configfile: config.write(configfile)
#生成文件內容以下
![](http://static.javashuo.com/static/loading.gif)
conf.read('f2') #讀取配置文件 conf['bitbucket.org']['user'] #返回值hg
import hashlib """用於加密相關的操做,3.X裏代替了md5模塊和啥模塊,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法""" 例子: m = hashlib.md5() m.update(b"hhhh") print(m.hexdigest()) m.update(b'xxx') print(m.hexdigest())
結果:
logging模塊提供了標準的日誌接口,你能夠經過它存儲各式格式的日誌,logging的日誌能夠分爲debug(),info(),warning(),error()and critical()5個級別
日誌級別大小關係爲:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET。
#日誌級別從大到小
1 logging.critical("server is run") 2 logging.error("error...") 3 logging.warning("user ....login in") 4 logging.info("This is info.") 5 logging.debug("debug...")
#將日誌輸入文件
1 logging.basicConfig(filename='f3',level=logging.INFO, 2 format='%(name)s %(filename)s %(funcName)s %(module)s %(lineno)d %(created)f %(relativeCreated)d %(asctime)s %(message)s', 3 datefmt='%m/%d/%Y %I:%M:%S %p') 4 def run(): 5 logging.info("xxx") 6 7 run() #函數調用
#日誌格式
%(name)s #Logger的名字算法 |
%(levelno)s #數字形式的日誌級別shell |
%(levelname)s #文字形式的日誌級別bash |
%(pathname)s #調用日誌輸出函數的模塊的完整路徑名。可能沒有app |
%(filename)s #調用日誌輸出函數的模塊的文件名dom |
%(module)s #調用日誌輸出函數的模塊名函數 |
%(funcName)s #調用日誌輸出函數的函數名工具 |
%(lineno)d #調用日至輸出函數的語句所在的代碼行優化 |
%(created)f # 當前時間,用UNIX標準的表示時間的浮點數表示 |
%(relativeCreated)d #輸出日誌信息時,自Logger建立以來的毫秒數 |
%(asctime)s #字符串形式的當前時間,默認格式「11/02/2017 04:32:51,98」.逗號後面是毫秒 |
%(message)s #用戶輸出消息 |
%(thread)s #線程ID。可能沒有 |
%(process)s #進程ID。可能沒有 |
%(threadName)s #線程名。可能沒有 |
# Python 使用logging模塊記錄日誌涉及四個主要類,使用官方文檔中的歸納最爲合適: # 1.logger提供了應用程序能夠直接使用的接口 # 2.handler將(logger建立的)日誌記錄發送到合適的目的輸出 # 3.filter提供了細度設備來決定輸出哪條日誌記錄 # 4.formatter決定日誌記錄的最終輸出格式 # # logger # 每一個程序在輸出信息以前都要得到一個Logger。logger一般對應了程序的模塊名。好比聊天工具的圖形界面模塊: # LOG = logging.getLogger("chat.gui") # 核心模塊: # LOG = logging.getLogger("chat.kernel")
Logger接口例子:
import logging
#建立一個logger logger = logging.getLogger('test') logger.setLevel(logging.DEBUG) #建立一個handler 和設置級別,屏幕上展現 ch = logging.StreamHandler() ch.setLevel(logging.WARNING) #建立一個handler和設置一個級別,寫入到文件裏面 fh = logging.FileHandler("access.log",encoding='utf-8') #若是不加,中文是亂碼 fh.setLevel(logging.ERROR) #定義一個日誌格式 ch_format=logging.Formatter('%(name)s - %(filename)s - %(asctime)s - %(message)s') fh_format=logging.Formatter('%(name)s %(filename)s %(asctime)s %(message)s') #結合起來 ch.setFormatter(ch_format) fh.setFormatter(fh_format) logger.addHandler(ch) logger.addHandler(fh) logger.warning("這是警告級別") #由於日誌級別爲WARNING,因此只有屏幕展現,不符合文件寫入級別,因此文件無內容 logger.error("這是錯誤級別") #符合文件和屏幕日誌級別,都展現
日誌自動截斷
1 import logging 2 import time 3 from logging import handlers 4 5 logger = logging.getLogger('test') 6 7 log_file ="timelog.log" 8 9 #定義日誌大小最大10個字節,2個文件 10 #除了日誌大小截斷,還能夠根據時間,when參數是一個字符串。表示時間間隔單位,不區分大小寫,他如下取值: 11 #S秒,M分,H小時,D天,W每星期(interval==0時表明星期一),midnight天天凌晨 12 13 #fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=2) 14 fh = handlers.TimedRotatingFileHandler(filename=log_file,when='S',backupCount=2) 15 16 17 18 19 formatter = logging.Formatter('%(asctime)s %(module)s %(message)s') 20 21 fh.setFormatter(formatter) 22 23 logger.addHandler(fh) 24 25 #logging開始調用 26 logger.warning("1") 27 logger.warning("12") 28 logger.warning("123") 29 time.sleep(2) 30 logger.warning("12345") 31 logger.warning("13456789")
經常使用正則表達式符號:
1 '.' 默認匹配除\n以外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行 2 '^' 匹配字符開頭,若指定flags MULTILINE,這種也能夠匹配上(r"^a","\nabc\neee",flags=re.MULTILINE) 3 '$' 匹配字符結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也能夠 4 '*' 匹配*號前的字符0次或屢次,re.findall("ab*","cabb3abcbbac") 結果爲['abb', 'ab', 'a'] 5 '+' 匹配前一個字符1次或屢次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb'] 6 '?' 匹配前一個字符1次或0次 7 '{m}' 匹配前一個字符m次 8 '{n,m}' 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果'abb', 'ab', 'abb'] 9 '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC' 10 '(...)' 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c 11 12 13 '\A' 只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的 14 '\Z' 匹配字符結尾,同$ 15 '\d' 匹配數字0-9 16 '\D' 匹配非數字 17 '\w' 匹配[A-Za-z0-9] 18 '\W' 匹配非[A-Za-z0-9] 19 's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t' 20 21 '(?P<name>...)' 分組匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 結果{'province': '3714', 'city': '81', 'birthday': '1993'}
最經常使用的匹配語法
1 re.match 從頭開始匹配 2 re.search 匹配包含 3 >>> a = re.search("(\d{1,3}\.){3}\d{1,3}","inet 192.168.15.111 netmask 0xffffff00 4 >>> a 5 <_sre.SRE_Match object; span=(5, 19), match='192.168.15.111'> 6 >>> a.group() 7 '192.168.15.111' 8 9 10 re.findall 把全部匹配到的字符放到以列表中的元素返回 11 >>> re.findall("\d+","asdasd1231zxc222") 12 ['1231', '222'] 13 14 re.splitall 以匹配到的字符當作列表分隔符 15 >>> re.split("\d+","asdasd1231zxc222dd") 16 ['asdasd', 'zxc', 'dd'] 17 18 re.sub 匹配字符並替換 19 >>> re.sub("\d+","|","asdasd1231zxc222dd123vvgh",count=2) 20 'asdasd|zxc|dd123vvgh'