以列表返回全部知足條件的結果python
1 import re 2 print(re.findall('\d','a1b2c2abc123'))#['1', '2', '2', '1', '2', '3']
查找到第一個匹配信息就返回一個包含匹配信息的對象(未找到時返回None),該對象經過group()函數查看結果正則表達式
1 import re 2 3 str = 'a1b2c2abc123' 4 print(re.search('\d', str).group()) # 1
從字符串開始位置匹配,其它同search()shell
1 import re 2 3 str = 'a1b2c2abc123' 4 print(re.match('\d', str).group() if re.match('\d', str) else '未找到') # 未找到 5 print(re.match('a.+', str).group() if re.match('a', str) else '未找到') # a1b2c2abc123
以正則匹配到的字符切割字符串,返回切割後的字符串列表json
1 import re 2 3 str = 'a1b2c2abc123' 4 print(re.split('[123]', str)) # ['a', 'b', 'c', 'abc', '', '', '']
將匹配到的內容替換爲指定內容,返回替換後的字符串()bash
1 import re 2 3 str = 'a1b2c2abc123' 4 print(re.sub('[123]', 'A', str)) # aAbAcAabcAAA
將匹配到的內容替換爲指定內容,返回元祖.第一個值是替換後的字符串,第二個值是替換的次數數據結構
1 import re 2 3 str = 'a1b2c2abc123' 4 print(re.subn('[123]', 'A', str)) # ('aAbAcAabcAAA', 6)
將正則表達式編譯爲字節碼對象,可屢次調用app
1 import re 2 3 str = 'a1b2c2abc123' 4 re_obj = re.compile('[123]') 5 print(re_obj.sub('A', str)) # aAbAcAabcAAA 6 print(re_obj.subn('A', str)) # ('aAbAcAabcAAA', 6) 7 print(re_obj.findall(str)) # ['1', '2', '2', '1', '2', '3'] 8 print(re_obj.split(str)) # ['a', 'b', 'c', 'abc', '', '', ''] 9 print(re_obj.match(str)) # None 10 print(re_obj.search(str).group()) # 1
返回一個存放匹配結果的迭代器dom
1 import re 2 3 str = 'a1b2c2abc123' 4 result = re.finditer('\d', str) 5 print(result) # <callable_iterator object at 0x00000000026F80F0> 6 print(next(result).group()) # 1 7 print(next(result).group()) # 2 8 print([g.group() for g in result]) # ['2', '1', '2', '3']
findall會優先把組匹配結果內容返回ide
?: 可取消優先返回組匹配結果函數
1 import re 2 3 print(re.findall('zz([a-y])', 'zze')) # ['e'] 4 print(re.findall('zz(?:[a-y])', 'zze')) # ['zze']
當正則包含組時,切割結果會保留分割內容
1 import re 2 3 str = 'a1b2c2abc123' 4 print(re.split('\d', str)) # ['a', 'b', 'c', 'abc', '', '', ''] 5 print(re.split('(\d)', str)) # ['a', '1', 'b', '2', 'c', '2', 'abc', '1', '', '2', '', '3', '']
可經過'?P'給組命名
1 import re 2 3 str = '<title>python learning</title>' 4 result = re.search('<(?P<tag_name>[a-z]+)>(?P<title>.+)</([a-z]+)>', str) 5 print(result.group('title')) # python learning 6 print(result.group('tag_name')) # title 7 print(result.group()) # <title>python learning</title>
1 from collections import namedtuple 2 3 Point = namedtuple('point', ['x', 'y']) 4 point1 = Point(1, 2) 5 point2 = Point(2, 3) 6 print(point1) # point(x=1, y=2) 7 print(point1.x, point1.y) # 1 2 8 print(point2) # point(x=2, y=3) 9 print(point2.x, point2.y) # 2 3
1 from collections import deque 2 3 dq = deque([1, 2]) 4 dq.append('a') # 尾部插入 [1,2,'a'] 5 dq.appendleft('b') # 頭部插入 ['b',1,2,'a'] 6 dq.insert(2, 3) # ['b',1,3,2,'a'] 7 print(dq.pop()) # a 從後面取數據 8 print(dq.pop()) # 2 9 print(dq.popleft()) # b 從前面取數據 10 print(dq) # deque([1, 3])
1 # 有序字典 2 from collections import OrderedDict 3 4 od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) 5 for k in od: 6 print(k) 7 8 # result: 9 # a 10 # b 11 # c
1 from collections import defaultdict 2 3 d = defaultdict(lambda: 5) # 傳入callable參數 4 d['key1'] = 1 5 print(d['key1']) # 1 6 print(d['key']) # 5 不存在時使用默認值
1 from collections import Counter 2 3 c = Counter('abcdeabcdabcaba') 4 print(c) # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
一般來講,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量運行「type(time.time())」,返回的是float類型
如:'1999-12-06'
python中時間日期格式化符號:
%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 當前時區的名稱 %% %號自己
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 |
1 import time 2 print(time.time()) # 1535813663.732
1 import time 2 3 print(time.strftime("%Y-%m-%d %X")) # 2018-09-01 22:55:30 4 print(time.strftime("%Y-%m-%d %H-%M-%S")) # 2018-09-01 22-55-30
1 import time 2 3 print( 4 time.localtime()) # time.struct_time(tm_year=2018, tm_mon=9, tm_mday=1, tm_hour=22, tm_min=56, tm_sec=31, tm_wday=5, tm_yday=244, tm_isdst=0)
1 import time 2 3 # 時間戳-->結構化時間 localtime() 4 print(time.localtime( 5 1600000000)) # time.struct_time(tm_year=2020, tm_mon=9, tm_mday=13, tm_hour=20, tm_min=26, tm_sec=40, tm_wday=6, tm_yday=257, tm_isdst=0) 6 7 # 結構化時間-->時間戳 mktime() 8 print(time.mktime(time.localtime(1600000000))) # 1600000000.0
1 import time 2 3 # 結構化時間-->字符串時間 4 # time.strftime("格式定義","結構化時間") 結構化時間參數若不傳,則顯示當前時間 5 print(time.strftime("%Y-%m-%d %X")) # 2018-09-01 23:06:43 6 print(time.strftime("%Y-%m-%d", time.localtime(1600000000))) # 2020-09-13 7 8 # 字符串時間-->結構化時間 9 # time.strptime(時間字符串,字符串對應格式) 10 print(time.strptime("2018-09-01 23:06:43", 11 "%Y-%m-%d %X")) # time.struct_time(tm_year=2018, tm_mon=9, tm_mday=1, tm_hour=23, tm_min=6, tm_sec=43, tm_wday=5, tm_yday=244, tm_isdst=-1) 12 print(time.strptime("07/24/2017", 13 "%m/%d/%Y")) # time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=205, tm_isdst=-1)
1 import time 2 last_time=time.mktime(time.strptime('1997-05-12 08:30:00','%Y-%m-%d %H:%M:%S')) 3 time_now=time.mktime(time.strptime('2018-09-01 11:00:00','%Y-%m-%d %H:%M:%S')) 4 dif_time=time_now-last_time 5 struct_time = time.localtime(dif_time) 6 print('過去了%d年%d月%d天%d小時%d分鐘%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1, 7 struct_time.tm_mday-1,struct_time.tm_hour, 8 struct_time.tm_min,struct_time.tm_sec))
1 import random 2 3 print(random.random()) # 0.33630703804107664 大於0且小於1之間的小數 4 print(random.uniform(1, 3)) # 2.0639651365332607 大於1小於3的小數
1 import random 2 3 print(random.randint(1,5)) # 2 大於等於1且小於等於5之間的整數 4 print(random.randrange(1,10,2)) # 1 大於等於1且小於10之間的奇數
1 import random 2 3 # 隨機選擇一個返回 4 print(random.choice([1, '23', [4, 5]])) # 23 5 # 隨機選擇多個返回,返回的個數爲函數的第二個參數 6 print(random.sample([1, '23', [4, 5]], 2)) # ['23', [4, 5]]
1 import random 2 3 item = [1, 2, 3, 4, 5] 4 random.shuffle(item) # 打亂次序 5 print(item) # [4, 2, 5, 3, 1]
1 import random 2 3 def v_code(): 4 code = '' 5 for i in range(5): 6 num = random.randint(0, 9) 7 alf = chr(random.randint(65, 90)) 8 add = random.choice([num, alf]) 9 code = "".join([code, str(add)]) 10 11 return code 12 13 print(v_code())
os模塊是與操做系統交互的一個接口
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.system("bash command") 運行shell命令,直接顯示 os.popen("bash command).read() 運行shell命令,獲取執行結果 os.getcwd() 獲取當前工做目錄,即當前python腳本工做的目錄路徑 os.chdir("dirname") 改變當前腳本工做目錄;至關於shell下cd 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.getatime(path) 返回path所指向的文件或者目錄的最後訪問時間 os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間 os.path.getsize(path) 返回path的大小
sys模塊是與python解釋器交互的一個接口
sys.argv 命令行參數List,第一個元素是程序自己路徑 sys.exit(n) 退出程序,正常退出時exit(0),錯誤退出sys.exit(1) sys.version 獲取Python解釋程序的版本信息 sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值 sys.platform 返回操做系統平臺名稱
序列化:將對象轉成字符串
反序列化:將字符串轉成對象
用於字符串和python數據類型間進行轉換
dumps():序列化,將對象轉成字符串
loads():反序列化,將字符串轉成對象
1 import json 2 3 dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} 4 str_dic = json.dumps(dic) # 序列化:將一個字典轉換成一個字符串 5 print(type(str_dic), str_dic) # <class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"} 6 # 注意,json轉換完的字符串類型的字典中的字符串是由""表示的 7 8 dic2 = json.loads(str_dic) # 反序列化:將一個字符串格式的字典轉換成一個字典 9 # 注意,要用json的loads功能處理的字符串類型的字典中的字符串必須由""表示 10 print(type(dic2), dic2) # <class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} 11 12 list_dic = [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}] 13 str_dic = json.dumps(list_dic) # 也能夠處理嵌套的數據類型 14 print(type(str_dic), str_dic) # <class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] 15 list_dic2 = json.loads(str_dic) 16 print(type(list_dic2), list_dic2) # <class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
1 import json 2 f = open('file','w') 3 json.dump({'國籍':'中國'},f) 4 ret = json.dumps({'國籍':'中國'}) 5 f.write(ret+'\n') 6 json.dump({'國籍':'美國'},f,ensure_ascii=False) 7 ret = json.dumps({'國籍':'美國'},ensure_ascii=False) 8 f.write(ret+'\n') 9 f.close() 10 11 # file: 12 # {"\u56fd\u7c4d": "\u4e2d\u56fd"}{"\u56fd\u7c4d": "\u4e2d\u56fd"} 13 # {"國籍": "美國"}{"國籍": "美國"}
參數說明:
Skipkeys:默認值是False,若是dict的keys內的數據不是python的基本類型(str,unicode,int,long,float,bool,None),設置爲False時,就會報TypeError的錯誤。此時設置成True,則會跳過這類key ensure_ascii:,當它爲True的時候,全部非ASCII碼字符顯示爲\uXXXX序列,只需在dump時將ensure_ascii設置爲False便可,此時存入json的中文便可正常顯示。) indent:應該是一個非負的整型,若是是0就是頂格分行顯示,若是爲空就是一行最緊湊顯示,不然會換行且按照indent的數值顯示前面的空白分行顯示,這樣打印出來的json數據也叫pretty-printed json separators:分隔符,其實是(item_separator, dict_separator)的一個元組,默認的就是(‘,’,’:’);這表示dictionary內keys之間用「,」隔開,而KEY和value之間用「:」隔開。 default(obj) is a function that should return a serializable version of obj or raise TypeError. The default simply raises TypeError. sort_keys:將數據根據keys的值進行排序。
1 import json 2 data = {'username':['李華','二愣子'],'sex':'male','age':16} 3 json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) 4 print(json_dic2) 5 #result: 6 # { 7 # "age":16, 8 # "sex":"male", 9 # "username":[ 10 # "李華", 11 # "二愣子" 12 # ] 13 # }
dumps():序列化,將對象轉成字符串並經過文件句柄輸出到文件
loads():反序列化,經過文件句柄讀取文件字符串內容並轉成對象
1 import json 2 f = open('json_file','w') 3 dic = {'k1':'v1','k2':'v2','k3':'v3'} 4 json.dump(dic,f) #dump方法接收一個文件句柄,直接將字典轉換成json字符串寫入文件 5 f.close() 6 7 f = open('json_file') 8 dic2 = json.load(f) #load方法接收一個文件句柄,直接將文件中的json字符串轉換成數據結構返回 9 f.close() 10 print(type(dic2),dic2)
用於python特有的類型和python的數據類型間進行轉換
序列化,將對象轉換爲bytes
反序列化,將bytes轉換成對象
1 str_dic = pickle.dumps(dic) 2 print( 3 str_dic) # b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.' 4 5 dic2 = pickle.loads(str_dic) 6 print(dic2) # {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} 7 8 import time
序列化,將對象轉換爲bytes,並經過文件句柄保存到文件
反序列化,經過文件句柄讀取bytes並轉換成對象
1 import pickle 2 import time 3 4 struct_time = time.localtime(1000000000) 5 print( 6 struct_time) # time.struct_time(tm_year=2001, tm_mon=9, tm_mday=9, tm_hour=9, tm_min=46, tm_sec=40, tm_wday=6, tm_yday=252, tm_isdst=0) 7 f = open('pickle_file', 'wb') 8 pickle.dump(struct_time, f) 9 f.close() 10 11 f = open('pickle_file', 'rb') 12 struct_time2 = pickle.load(f) 13 print(struct_time2.tm_year) # 2001
經過文件句柄序列化同步到文件
1 import shelve 2 3 f1 = shelve.open('shelve_file') 4 f1['key'] = {1: 'a'} 5 f1.close() 6 # writeback爲True時,所作變動會同步到文件 7 f2 = shelve.open('shelve_file', writeback=True) 8 print(f2['key']) # {1: 'a'} 9 f2['key']['new_value'] = 'this was not here before' 10 print(f2['key']) # {1: 'a', 'new_value': 'this was not here before'} 11 f2.close()
1 import hashlib 2 3 str = '123' 4 md5_helper = hashlib.md5() 5 md5_helper.update(bytes(str, 'utf-8')) 6 print(md5_helper.hexdigest()) # 202cb962ac59075b964b07152d234b70 7 8 sha_helper = hashlib.sha1() 9 sha_helper.update(bytes(str, 'utf-8')) 10 print(sha_helper.hexdigest()) # 40bd001563085fc35165329ea1ff5c5ecbdbbeef
1 import hashlib 2 3 str = '123' 4 md5_helper = hashlib.md5() 5 md5_helper.update(bytes(str, 'utf-8')) 6 print(md5_helper.hexdigest()) # 202cb962ac59075b964b07152d234b70 7 # 加鹽 8 md5_salt_helper = hashlib.md5("salt".encode("utf8")) 9 md5_salt_helper.update(bytes(str, 'utf-8')) 10 print(md5_salt_helper.hexdigest()) # 8c4fb7bf681156b52fea93442c7dffc9
1 import configparser 2 3 config = configparser.ConfigParser() 4 5 config["DEFAULT"] = {'ServerAliveInterval': '45', 6 'Compression': 'yes', 7 'CompressionLevel': '9', 8 'ForwardX11': 'yes' 9 } 10 11 config['bitbucket.org'] = {'User': 'hg'} 12 13 config['topsecret.server.com'] = {'Host Port': '50022', 'ForwardX11': 'no'} 14 15 with open('example.ini', 'w') as configfile: 16 config.write(configfile) 17 18 # example.ini: 19 # [DEFAULT] 20 # serveraliveinterval = 45 21 # compression = yes 22 # compressionlevel = 9 23 # forwardx11 = yes 24 # 25 # [bitbucket.org] 26 # user = hg 27 # 28 # [topsecret.server.com] 29 # host 30 # port = 50022 31 # forwardx11 = no
1 import configparser 2 3 config = configparser.ConfigParser() 4 5 # ---------------------------查找文件內容,基於字典的形式 6 7 print(config.sections()) # [] 8 9 config.read('example.ini') 10 11 print(config.sections()) # ['bitbucket.org', 'topsecret.server.com'] 12 13 print('bytebong.com' in config) # False 14 print('bitbucket.org' in config) # True 15 16 print(config['bitbucket.org']["user"]) # hg 17 18 print(config['DEFAULT']['Compression']) # yes 19 20 print(config['topsecret.server.com']['ForwardX11']) # no 21 22 print(config['bitbucket.org']) # <Section: bitbucket.org> 23 24 # 注意,有default會默認default的鍵 25 for key in config['bitbucket.org']: 26 print(key) 27 # user 28 # serveraliveinterval 29 # compression 30 # compressionlevel 31 # forwardx11 32 33 # 同for循環,找到'bitbucket.org'下全部鍵 34 print( 35 config.options('bitbucket.org')) # ['user', 'serveraliveinterval', 'compression', 'compressionlevel', 'forwardx11'] 36 # 找到'bitbucket.org'下全部鍵值對 37 print(config.items( 38 'bitbucket.org')) # [('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('forwardx11', 'yes'), ('user', 'hg')] 39 # 獲取Section下的key對應的value 40 print(config.get('bitbucket.org', 'compression')) # yes
1 import configparser 2 3 config = configparser.ConfigParser() 4 5 config.read('example.ini') 6 7 config.add_section('yuan') 8 9 config.remove_section('bitbucket.org') 10 config.remove_option('topsecret.server.com', "forwardx11") 11 12 config.set('topsecret.server.com', 'k1', '11111') 13 config.set('yuan', 'k2', '22222') 14 with open('new.ini', "w") as f: 15 config.write(f) 16 17 # example.ini: 18 # [DEFAULT] 19 # serveraliveinterval = 45 20 # compression = yes 21 # compressionlevel = 9 22 # forwardx11 = yes 23 # 24 # [bitbucket.org] 25 # user = hg 26 # 27 # [topsecret.server.com] 28 # host port = 50022 29 # forwardx11 = no 30 31 # new.ini: 32 # [DEFAULT] 33 # serveraliveinterval = 45 34 # compression = yes 35 # compressionlevel = 9 36 # forwardx11 = yes 37 # 38 # [topsecret.server.com] 39 # host port = 50022 40 # k1 = 11111 41 # 42 # [yuan] 43 # k2 = 22222
1 import logging 2 logging.debug('debug message') 3 logging.info('info message') 4 logging.warning('warning message') 5 logging.error('error message') 6 logging.critical('critical message')
默認狀況下Python的logging模塊將日誌打印到了標準輸出中,且只顯示了大於等於WARNING級別的日誌,這說明默認的日誌級別設置爲WARNING(日誌級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG)
中文會出現亂碼狀況
1 import logging 2 3 logging.basicConfig(level=logging.DEBUG, 4 format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', 5 datefmt='%a, %d %b %Y %H:%M:%S', 6 filename='test.log', 7 filemode='w') 8 9 logging.debug('debug message') 10 logging.info('info message') 11 logging.warning('warning message') 12 logging.error('error message') 13 logging.critical('critical message') 14 15 # test.log: 16 # Tue, 04 Sep 2018 22:10:44 loggingģ��.py[line:19] DEBUG debug message 17 # Tue, 04 Sep 2018 22:10:44 loggingģ��.py[line:20] INFO info message 18 # Tue, 04 Sep 2018 22:10:44 loggingģ��.py[line:21] WARNING warning message 19 # Tue, 04 Sep 2018 22:10:44 loggingģ��.py[line:22] ERROR error message 20 # Tue, 04 Sep 2018 22:10:44 loggingģ��.py[line:23] CRITICAL critical message
1 import logging 2 3 logger = logging.getLogger() 4 # 建立一個handler,用於寫入日誌文件 5 fh = logging.FileHandler('test.log', encoding='utf-8') 6 7 # 再建立一個handler,用於輸出到控制檯 8 ch = logging.StreamHandler() 9 formatter = logging.Formatter('%(asctime)s - %(filename)s - %(levelname)s - %(message)s') 10 11 fh.setLevel(logging.DEBUG) 12 13 fh.setFormatter(formatter) 14 ch.setFormatter(formatter) 15 ##logger對象能夠添加多個fh和ch對象 16 logger.addHandler(fh) 17 logger.addHandler(ch) 18 19 logger.debug('logger debug message') 20 logger.info('logger info message') 21 logger.warning('logger warning message') 22 logger.error('logger error message') 23 logger.critical('logger critical message') 24 25 #test.log: 26 # 2018-09-04 22:19:08,855 - logging模塊.py - WARNING - logger warning message 27 # 2018-09-04 22:19:08,855 - logging模塊.py - ERROR - logger error message 28 # 2018-09-04 22:19:08,855 - logging模塊.py - CRITICAL - logger critical message
logging.basicConfig()函數中可經過具體參數來更改logging模塊默認行爲,可用參數有: filename:用指定的文件名建立FiledHandler,這樣日誌會被存儲在指定的文件中。 filemode:文件打開方式,在指定了filename時使用這個參數,默認值爲「a」還可指定爲「w」。 format:指定handler使用的日誌顯示格式。 datefmt:指定日期時間格式。 level:設置rootlogger(後邊會講解具體概念)的日誌級別 stream:用指定的stream建立StreamHandler。能夠指定輸出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默認爲sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。 format參數中可能用到的格式化串: %(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:線程名。可能沒有 %進程ID。可能沒有 %(message)s:用戶輸出的消息