經常使用模塊學習

本節大綱

 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  #若是在改文件下有相同函數,重命名再調用。

Import本質:

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")

 

Time&datetime

Time:import time  

 

在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:import datetime

>>> 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:import random


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)

 

os

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模塊

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模塊

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對象

 

zipfile模塊

 

 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模塊

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)
#生成文件內容以下
conf.read('f2') #讀取配置文件  conf['bitbucket.org']['user'] #返回值hg

 hashlib模塊

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模塊提供了標準的日誌接口,你能夠經過它存儲各式格式的日誌,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")
 

 re模塊

經常使用正則表達式符號:

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