python_常用內置模塊


一、time模塊(時間模塊):

  表示時間的三種方法:

    在Python中,通常有這三種方式來表示時間:時間戳、元組(struct_time)、格式化的時間字符串:

    (1)時間戳(timestamp) :通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們運行“type(time.time())”,返回的是float類型。

    (2)格式化的時間字符串(Format String): ‘1995-10-04’

%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 當前時區的名稱
%% %號本身
時間格式化符號

    (3)元組(struct_time) :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等

            

1 import time
2 3 
4 print(time.asctime()) # 返回時間的格式:Sun May 20 21:31:15 2018
5 print(time.time()) # 返回時間戳:1526823135.9531205
6 print(time.gmtime()) # 同time.localtime()效果一樣;返回本地時間的struct time對象格式:time.struct_time(tm_year=2018, tm_mon=5, tm_mday=20, tm_hour=13, tm_min=33, tm_sec=33, tm_wday=6, tm_yday=140, tm_isdst=0)
7 print(time.localtime())
8 print(time.strftime("%Y-%m-%d")) #返回自定義格式的當前時間 :2018-05-20
9 print(time.strptime("2018-05-20","%Y-%m-%d")) # 將指定的時間轉為struct time對象格式:time.struct_time(tm_year=2018, tm_mon=5, tm_mday=20, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=140, tm_isdst=-1)

 

1 import datetime
2 
3 print(datetime.datetime.now())  # 返回當前時間:2018-05-20 21:42:57.486770
4 print(datetime.date.fromtimestamp(time.time())) #將時間戳轉換為時間格式:2018-05-20
5 print(datetime.datetime.now() + datetime.timedelta(3))    # 返回時間在當前日期上 +3 天
6 print(datetime.datetime.now() + datetime.timedelta(-3))    # 返回時間在當前日期上 -3 天
7 print(datetime.datetime.now() + datetime.timedelta(hours= 3)) # 返回時間在當前時間上 +3 小時
8 print(datetime.datetime.now() + datetime.timedelta(minutes=30))  # 返回時間在當前時間上 +30 分鍾

二、random模塊(隨機數模塊):

 1 import random
 2 
 3 print(random.random())  #返回0到1之間的一個小數:0.9228097480430517
 4 print(random.uniform(1,3)) # 返回指定區域的任意一個浮點數
 5 print(random.randint(1,5)) #返回1到5之間的整數
 6 print(random.randrange(10)) #返回一個整數
 7 print(random.choice("hello")) #返回字符串中任意一個元素
 8 print(random.sample("hello",3)) # 以列表的形式返回指定個數的任意元素
 9 
10 # 生成隨機數
11 
12 RandomNum=""
13 for i in range(5):
14 
15     AddNum=random.choice([random.randint(1.,10),chr(random.randint(65,90))])
16     RandomNum+=str(AddNum)
17 
18 print(RandomNum)

 三、OS模塊(python調用系統動作的接口)

 1 import os
 2 
 3 print(os.getcwd()) #獲取當前工作目錄
 4 os.chdir('D:\\Py_dir') # 切換目錄
 5 print(os.curdir)  #返回當前目錄
 6 print(os.pardir)  #返回父級目錄
 7 os.makedirs('aaa\\bbb\ccc') #遞歸創建目錄
 8 os.removedirs('aaa\\bbb\ccc')  # 遞歸刪除空目錄,若非空,則停止刪除
 9 os.mkdir('aaa') # 創建單目錄
10 os.rmdir('aaa') #刪除單個非空目錄
11 print(os.listdir()) # 查看目錄內容
12 os.remove() # 刪除一個文件
13 os.rename("oldname","newname") # 重命名文件與目錄
14 os.stat('aaa\\1.txt') # 獲取文件的信息
15 print(os.sep) # 輸出當前系統的分隔符 win下是‘\’,linux下是‘/’
16 os.linesep # 輸出當前系統的行終止符
17 os.pathsep #輸出當前系統的路徑分隔符
18 os.system() # 執行系統命令
19 os.name() # 返回系統類型
20 os.environ # 返回環境變量
21 os.path.abspath() # 返回絕對路徑
22 os.path.split('/aaa/bbb/1.txt')  # 把路徑跟文件名分開
23 os.path.dirname('/aaa/bbb/1.txt')  # 返回文件的所在的路徑
24 os.path.basename('/aaa/bbb/1.txt') # 返回文件名
25 os.path.exists('/aaa/bbb/1.txt') #判斷目錄是否存在
26 os.path.isabs('/aaa/bbb/') # 判斷是不是絕對路徑
27 os.path.isdir('/aaa/bbb/') # 判斷目錄是否存在
28 os.path.join(['aaa','bbb']) # 合並目錄

 

四、sys模塊(對python解釋器的操作)

1 import sys
2 
3 print(sys.argv) # 以列表的形式返回文件的絕對路徑和所傳的參數
4 print(sys.argv[0]) # 返回當前文件的絕對路徑
5 print(sys.argv[1]) # 返回傳入當前文件的第一個參數
6 sys.exit() # 退出程序
7 sys.path # 返回模塊路徑的環境變量
8 print(sys.platform) # 返回操作系統的名稱

五、logging(日志模塊)

 logging基本使用:

 1 import logging
 2 
 3 logging.debug("this is debug")
 4 logging.info("this is info")
 5 logging.warning("this is warning")
 6 logging.error("this is error")
 7 logging.critical("this is critical")
 8 
 9 >>>
10     WARNING:root:this is warning
11     ERROR:root:this is error
12     CRITICAL:root:this is critical    

 

  logging模塊中的日志級別從小到大分為:

     debug(調試)、info(信息)、warning(警告)、error(錯誤)以及critical(嚴重)

  logging模塊默認輸出warning級別的日志,也可以對日志級別和輸出格式進行個性化設置:

import logging

logging.basicConfig(
    level=logging.DEBUG,  # 設置日志輸出的界別
    format='%(asctime)s - %(filename)s - %(levelname)s - %(message)s', # 輸出日志的格式
    filename="test.log",  # 將日志輸出到文件中,如果不加這參數默認是輸出到屏幕上
    filemode="a"   # 將日志寫入文件的方式,默認為“a”追加,還可以改成“w”寫入
)

logging.debug("this is debug")
logging.info("this is info")
logging.warning("this is warning")
logging.error("this is error")
logging.critical("this is critical")

 

%(name)s          Logger的名字
%(levelno)s        數字形式的日志級別
%(levelname)s   文本形式的日志級別
%(pathname)s   調用日志輸出函數的模塊的完整路徑名,可能沒有
%(filename)s     調用日志輸出函數的模塊的文件名
%(module)s       調用日志輸出函數的模塊名
%(funcName)s    調用日志輸出函數的函數名
%(lineno)d         調用日志輸出函數的語句所在的代碼行
%(created)f        當前時間,用UNIX標准的表示時間的浮 點數表示
%(relativeCreated)d  輸出日志信息時的,自Logger創建以 來的毫秒數
%(asctime)s       字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號后面的是毫秒
%(thread)d         線程ID。可能沒有
%(threadName)s   線程名。可能沒有
%(process)d        進程ID。可能沒有
%(message)s      用戶輸出的消息        
format的參數及作用

logging高級用法:  

  將日志同時輸出到屏幕與文件

 1 logger = logging.getLogger("Adair") # 創建一個logger對象,默認用戶為root
 2 logger.setLevel(logging.DEBUG)  # 設置輸出日志的級別
 3 
 4 fileoutput = logging.FileHandler("logs.log") # 創建一個用於文件輸入的處理器
 5 screenoutput = logging.StreamHandler()  #創建一個用於屏幕輸出的處理器
 6 
 7 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 指定日志格式
 8 
 9 fileoutput.setFormatter(formatter) # 文件輸出獲取日志格式
10 screenoutput.setFormatter(formatter) # 屏幕輸出獲取日志格式
11 
12 logger.addHandler(fileoutput)  # 將文件輸入處理器添加到logger對象中
13 logger.addHandler(screenoutput) # 將屏幕輸出處理器添加到logger對象中
14 
15 logger.debug("this is debug")
16 logger.info("this is info")
17 logger.warning("this is warning")
18 logger.error("this is error")
19 logger.critical("this is critical")
1 http://python.jobbole.com/87300/
2 http://www.cnblogs.com/yuanchenqi/articles/5732581.html
詳情參考文檔

 六、configparser(解析配置文件模塊)

先生成一個配置文件:

 1 import configparser
 2 
 3 config = configparser.ConfigParser() # 創建一個config對象
 4 
 5 config["DEFAULT"] = {
 6     'ServerType':'weblogic',
 7     'ServerPort':'7001'
 8 }
 9 config["BACKUP"] = {
10     "BackupType":"Full",
11     "BackupTime":"23:00",
12     "BackupUser":"weblogic"
13 }
14 config["DEPLOY"] = {
15     "DeployType":"incremental",
16     "DeployUser":"webloic"
17 }
18 config["DEFAULT"]['ServerUrl'] = "http://127.0.0.1:7922/console"
19 
20 with open('config.ini','w') as configfile:
21     config.write(configfile)

配置文件的格式跟windows下的ini配置文件相似,可以包含一個或多個節(section), 每個節可以有多個參數(鍵=值):

 1 [DEFAULT]
 2 servertype = weblogic
 3 serverport = 7001
 4 serverurl = http://127.0.0.1:7922/console
 5 
 6 [BACKUP]
 7 backuptype = Full
 8 backuptime = 23:00
 9 backupuser = weblogic
10 
11 [DEPLOY]
12 deploytype = incremental
13 deployuser = webloic

 

 配置文件的增刪改查:

 1 print(config.sections()) # 獲取所有的節,不包括DEFAULT,DEFAULT是特殊的默認節
 2 
 3 print(config.items("BACKUP")) # 獲取指定節的值(key:values),輸出時DEFAULT默認節也會一同輸出
 4 print(config.options("BACKUP")) # 獲取指定節的值(key),輸出時DEFAULT默認節也會一同輸出
 5 
 6 for key in config['DEPLOY']:  # 獲取指定節的值(key),輸出時DEFAULT默認節也會一同輸出
 7     print(key)
 8 
 9 # 獲取指定key的value值:
10 print(config['DEPLOY']['deploytype'])
11 print(config.get('DEPLOY','deploytype'))
12 print(config.getint('DEFAULT','serverport'))
13 
14 # 添加
15 config.add_section('compile')
16 config.set('compile','CompileType','ant')
17 config.write(open('config.ini','w'))
18 
19 # 刪除
20 config.remove_option('DEPLOY','deploytype')
21 config.remove_section('BACKUP')
22 config.clear() # 清除DEFAULT以外的所有內容
23 config.write(open('config.ini','w'))

 

DEFAULT:

[DEFAULT] 一般包含 ini 格式配置文件的默認項,所以 configparser 部分方法會自動跳過這個 section 。 前面已經提到 sections() 是獲取不到的,還有刪除方法對 [DEFAULT] 也無效
但指定刪除和修改 [DEFAULT] 里的 keys & values 是可以的:
1 config.remove_option('DEFAULT','servertype')  # 刪除DEFAULT中的key
2 config.set('DEFAULT','serverport','8080')  # 修改DEFAULT中指定key的值
3 config.write(open('config.ini','w'))
注:文件中的內容一旦保存在磁盤中,是不會被修改的。所以每次操作動作執行完都要加上config.write(open('config.ini','w'))這一句將之前的文件內容進行覆蓋。

七、re模塊(正則表達式)

簡介:

   正則表達式是一種小型的、用來匹配字符串的高度專業化的編程語言,Python將正則表達式嵌入到了re模塊中,方便py粉兒使用。

1  s="hello world"
2  
3  print(s.find('or'))
4  >>>7
5  print(s.replace('ll','aa'))
6  >>>heaao world
7  print(s.split(' '))
8  >>>['hello', 'world']

  字符串自身的方法是完全匹配,而有些場景字符串自身的方法並不能完全滿足,比如在一堆人員中過濾出電話號,這時候就需要使用模糊匹配,而正則表達式就是為了提供模糊匹配的一種編程語言。

元字符:有特殊意義的字符

    .   ^  *  +  ?  {  }  [  ]  |  (  )  \      

 1 import re
 2 s = "My name is Ye xiaohei"
 3 print(re.findall('xiaohei',s)) # findall 以列表的形式輸出所有匹配項
 4 >>>['xiaohei']
 5 print(re.findall('h.i',s))  # . 只能匹配一個字符,換行符(\n)除外
 6 >>>['hei']
 7 print(re.findall('^hei',s)) # ^ 只從開頭匹配
 8 >>>[]
 9 print(re.findall('hei$',s)) # $ 只在結尾匹配
10 >>>['hei']
11 print(re.findall('xiao*','xiaooooooooo')) # * 匹配前一個字符的0到多次
12 >>>['xiaooooooooo']
13 print(re.findall('hei+','xiaoooheoo')) # + 匹配前一個字符的1到多次
14 >>>[]
15 print(re.findall('xia?o','xiaoooxiooo')) # ? 匹配0到1次
16 >>>['xiao', 'xio']
17 print(re.findall('xi{5}ao','xiiiiiaoooo')) # {m} 匹配前一個字符的N次
18 >>>['xiiiiiao']
19 print(re.findall('xi{1,3}ao','xiaoooo')) # {m,n} 匹配前一個字符的m到n次
20 >>>['xiao']
21 print(re.findall('[i,o]',s)) # [] 匹配元字符集中的任意字符
22 >>>['i', 'i', 'o', 'i']
23 print(re.findall('\d{5}','asd230498327843vfeq')) # \ 轉義字符后邊跟普通字符實現特殊功能
24 >>>['23049', '83278']
25 print(re.findall('\*','asd2304983*27843vfeq')) # \ 轉義字符后邊跟元字符取消特殊功能
26 >>>['*']
27 print(re.search('i',s)) # search 方法以對象的方式輸出匹配的第一項
28 >>><_sre.SRE_Match object; span=(8, 9), match='i'>
 1 print(re.findall('a|1','asddsa1321')) # | “或”的意思,截取管道符左邊的或者右邊的字符
 2 >>>['a', 'a', '1', '1']
 3 print(re.findall('(as)+','asasassaasdfasfas')) # () 分組 括號內的字符為一組,作為整體去匹配
 4 >>>['as', 'as', 'as', 'as']
 5 print(re.findall('(as|sa)','asaaadsasaadsa'))
 6 >>>['as', 'sa', 'sa', 'sa']
 7 ret=re.search('(?P<id>\w{3})/(?P<path>\d*)','asd/5412543')  # (?P<組名>匹配規則) 固定格式  為每個標注出名字 方便調用
 8 print(ret.group())
 9 >>>asd/5412543
10 print(ret.group('id'))
11 >>>asd
12 print(ret.group('path'))
13 >>>5412543

 

糾結的反斜杠:

與大多數編程語言相同,正則表達式里使用"\"作為轉義字符,這就可能造成反斜杠困擾。假如你需要匹配文本中的字符"\",那么使用編程語言表示的正則表達式里將需要4個反斜杠"\\\\":前兩個和后兩個分別用於在編程語言里轉義成反斜杠,轉換成兩個反斜杠后再在正則表達式里轉義成一個反斜杠。Python里的原生字符串很好地解決了這個問題,這個例子中的正則表達式可以使用r"\\"表示。同樣,匹配一個數字的"\\d"可以寫成r"\d"。有了原生字符串,你再也不用擔心是不是漏寫了反斜杠,寫出來的表達式也更直觀。

1 print(re.findall(r'\\','asd\dsa'))
2 >>>['\\']
3 print(re.findall('\\\\','asd\dsa'))
4 >>>['\\']

 元字符明細表:

轉至:(https://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html)

 正則表達式的方法:

  findall():以列表的形式返回匹配到的所有內容

  search():以object的形式只返回匹配到的第一個內容,可以使用group()方法查看結果

  match():只在字符串的開始匹配,以object的形式返回第一個內容,可以使用group()方法查看結果

  split():跟字符串的split()的方法一樣都是用來切分,格式:re.split('可用正則的切割符','被切割的內容')

  sub():替換內容,格式:re.sub('正則獲取需要替換內容','替換后的內容','替換內容')

  compile():將正則表達式編譯成正則表達式對象

正則計算器:

   水平一般,能力有限,歡迎來懟!

 1 # Author : Adair
 2 # -*- coding:utf-8 -*-
 3 
 4 import re,sys
 5 
 6 UserInput=input("請輸入你要計算的數字:")
 7 # UserInput="1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
 8 # UserInput="123+2333*10/8+2356+(123*58)"
 9 
10 def Format(original): # 格式化用戶輸入
11     ReplaceSpace=original.replace(' ','')  #清除空格
12     ParenGroup=re.search('(?P<BeforeBrackets>\()(?P<Digital>-?\d*\.?\d*)(?P<AfterBrackets>\))', ReplaceSpace)
13     if ParenGroup:
14         ParenProce=re.sub('\(-?\d*\.?\d*\)',ParenGroup.group('Digital'),ReplaceSpace,1)
15         SameSymbolSub_AddSub=re.sub('--|\+\+','+',ParenProce) # 相同符號替換 (加減)
16     else:
17         SameSymbolSub_AddSub=re.sub('--|\+\+','+',ReplaceSpace) # 相同符號替換 (加減)
18     SameSymbolSub_take=re.sub('\*\*','*',SameSymbolSub_AddSub) # 相同符號替換 (乘)
19     SameSymbolSub_division=re.sub('//','/',SameSymbolSub_take) # 相同符號替換 (除)
20     AdjDiffSymbol_SubAdd=re.sub('-\+|\+-','-',SameSymbolSub_division) # 相鄰不同符號替換 (加減)
21 
22     return AdjDiffSymbol_SubAdd
23 
24 def ComPlianceCheck(CheckItem): # 合法性檢查
25     flag=True
26     if re.findall('[a-zA-Z]',CheckItem):  # 不支持字母的運算
27         print("Input error: no alphabetic operation is supported! (%s)"%CheckItem)
28         flag=False
29     if re.findall('\*/|/\*',CheckItem): # 不合法的計算符
30         print("Input error: operator input error! (%s)"%CheckItem)
31         flag=False
32     return flag
33 
34 def Calculate(ori,cal): # 計算
35     if re.search('\*|/',cal): # 運算符優先級判斷
36         PacketProcessing = re.search('(?P<num1>-?\d+\.?\d*)(?P<operator>[*/])(?P<num2>-?\d+\.?\d*)', cal)
37     elif re.search('\+|-',cal):
38         PacketProcessing = re.search('(?P<num1>-?\d+\.?\d*)(?P<operator>[+\-])(?P<num2>-?\d+\.?\d*)', cal)
39     # 字符類型處理  str >>> int
40     Num1 = float(PacketProcessing.group('num1'))
41     Operator = PacketProcessing.group('operator')
42     Num2 = float(PacketProcessing.group('num2'))
43     if Operator == '+':
44         Results = Num1 + Num2
45         origi = ori.replace(PacketProcessing.group(), str(Results))
46         return origi
47     elif Operator == '-':
48         Results = Num1 - Num2
49         origi = ori.replace(PacketProcessing.group(), str(Results))
50         return origi
51     elif Operator == '*':
52         Results = Num1 * Num2
53         origi = ori.replace(PacketProcessing.group(), str(Results))
54         return origi
55     elif Operator == '/':
56         Results = Num1 / Num2
57         origi = ori.replace(PacketProcessing.group(), str(Results))
58         return origi
59 
60 def PriorityJud(PriJud): # 格式優先級判斷
61     ParenthesesRun = re.findall('\([^()]*-?\d+\.?\d*[+\-*/]-?\d+\.?\d*\)', PriJud)
62     if ParenthesesRun:
63         Parentheses=ParenthesesRun[0]
64         cal=Calculate(PriJud,Parentheses)
65     else:
66         cal=Calculate(PriJud,PriJud)
67     return cal
68 
69 # 流程控制
70 if ComPlianceCheck(UserInput):
71     Results = UserInput
72     formats = Format(Results)
73     while re.findall('-?\d+\.?\d*[*/+\-]+.?\d+\.?\d*', formats):
74         Results = PriorityJud(formats)
75         formats = Format(Results)
76     print(Results)
77 else:
78     sys.exit(0)
正則計算器

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM