您好!此筆記的文本和代碼以網盤形式分享於文末!
因個人能力有限,錯誤處歡迎大家交流和指正!基礎部分內容簡單,但多且零散!
python 常用模塊 | ||
1、collections模塊,除內置dict、list、set、tuple數據類型,collections提供了額外的數據類型。 | ||
namedtuple: 生成可以使用名字來訪問元素內容的tuple deque: 雙端隊列,可以快速的從另外一側追加和推出對象 Counter: 計數器,主要用來計數 OrderedDict: 有序字典 defaultdict: 帶有默認值的字典 |
||
用法 | 栗子 | 結果 |
namedtuple 表示二維座標 |
# namedtuple 生成可以使用名字來訪問元素內容的tuple from collections import namedtuple import math # 表示二維座標 point = namedtuple('point', ['x', 'y']) p = point(1, 2) print(p.x, p.y) # 圓心和半徑來表示圓 Circle = namedtuple('Circle', ['x', 'y', 'r']) c = Circle(1, 2, 5) c_area = math.pi * math.pow(c.r, 2) print('圓的面積爲', c_area) |
1 2 圓的面積爲 78.53981633974483 |
deque 高效的插入和刪除 適用於隊列和棧 |
# 實現了list的append、pop、appendleft、popleft的功能, # 高效的往頭部添加和刪除元素 from collections import deque q = deque(['a', 'b', 'c']) q.append('x') q.appendleft('y') print(q, type(q)) |
deque(['y', 'a', 'b', 'c', 'x']) <class 'collections.deque'> |
OrderedDict 保持key順序, 方便迭代使用 |
from collections import OrderedDict d = dict([('a', 1), ('b', 2), ('c', 3)]) print(d) od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(od, type(od)) # 按照插入順序返回 od['z'] = 4 od['x'] = 5 od['y'] = 6 print(od) |
py3.6後 字典有默認的順序 {'a': 1, 'b': 2, 'c': 3} OrderedDict([('a', 1), ('b', 2), ('c', 3)]) <class 'collections.OrderedDict'> OrderedDict([('a', 1), ('b', 2), ('c', 3), ('z', 4), ('x', 5), ('y', 6)]) |
# 將集合中所有大於66保存至‘k1’ # 即 {'k1': 大於66 , 'k2': 小於66} values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] my_dict = {} for value in values: if value > 66: if my_dict.__contains__('k1'): my_dict['k1'].append(value) else: my_dict['k1'] = [value] else: if my_dict.__contains__('k2'): my_dict['k2'].append(value) else: my_dict['k2'] = [value] print(my_dict) |
{'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]} | |
defaultdict 實現上邊的功能 指定了字典的 value值的類型 |
from collections import defaultdict values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] my_dict = defaultdict(list) for value in values: if value > 66: my_dict['k1'].append(value) else: my_dict['k2'].append(value) print(my_dict) |
defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]}) |
# 引用字典key值,防止不存在保存 from collections import defaultdict dd = defaultdict(lambda: 'N/A') dd['key1'] = 'abc' print(dd['key1'], dd['key2']) |
abc N/A | |
Counter 計數器 記錄元素出現的次數 返回鍵值對無序容器 |
from collections import Counter c = Counter('abcdeabcdabcaba') print(c, type(c)) |
Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1}) <class 'collections.Counter'> |
2、時間模塊time | https://www.cnblogs.com/Eva-J/articles/7291842.html | |
時間戳是計算機能夠識別的時間;時間字符串是人能夠看懂的時間;元組則是用來操作時間的 | ||
用法 | 栗子 | 結果 |
時間戳 時間字符串 元組 |
import time # 獲取時間戳 print(time.time()) # 時間字符串 print(time.strftime("%Y-%m-%d %X")) print(time.strftime("%Y-%m-%d %H-%M-%S")) # 時間元組:localtime 將一個時間戳轉換成當時區的 print(time.localtime()) |
展示結果爲: 1500875844.800804 2017-07-24 13:54:37 2017-07-24 13-55-04 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) |
# # UTC 倫敦時間 # print(time.gmtime()) # # 當地時間 # print(time.localtime()) |
||
# # 時間戳 --> 結構化時間 # # UTC 時間與北京時間差8小時 # print(time.gmtime(1500000000)) # print(time.localtime(1500000000)) |
||
# # 結構化時間 --> 時間戳 # time_tuple = time.localtime(1800000000) # print(time_tuple) # print(time.mktime(time_tuple)) |
||
# # 結構化時間 --> 字符串時間 # # time.strftime("格式定義","結構化時間") # print(time.strftime("%Y-%m-%d %X")) # print(time.strftime("%Y-%m-%d", time.localtime(1800000000))) |
||
# # 字符串時間 --> 結構化時間 # # time.strptime(時間字符串,字符串對應格式) # print(time.strptime("2017-03-16", "%Y-%m-%d")) # print(time.strptime("03/16/2017", "%m/%d/%Y")) |
||
# # 結構化時間 --> %a %b %d %H:%M:%S %Y串 # # time.asctime(結構化時間) 如果不傳參數,直接返回當前時間的格式化串 # print(time.asctime(time.localtime(1800000000))) # print(time.asctime()) |
||
# # 時間戳 --> %a %b %d %H:%M:%S %Y串 # # time.ctime(時間戳) 如果不傳參數,直接返回當前時間的格式化串 # print(time.ctime()) # print(time.ctime(1800000000)) |
||
3、random 模塊:import random | ||
用法 | 栗子 | 結果 |
隨機小數 | # 隨機小數 0<x<1 print(random.random()) # 可定範圍,例1<x<3 print(random.uniform(1, 3)) |
|
隨機整數 | # 隨機整數 例1<x<=5 print(random.randint(1, 5)) # 隨機整數 例1<x<=10的奇數 2爲遞增基數 print(random.randrange(1, 10, 2)) # 隨機整數 例0<x<=10的偶數 2爲遞增基數 print(random.randrange(0, 10, 2)) |
|
隨機返回 | # 隨機一個返回 print(random.choice([1, '23', [4, 5]])) # 指定隨機多個返回,例2個 print(random.sample([1, '23', [4, 5]], 2)) |
|
打亂列表 | # 打亂列表的順序 item = [1, 2, 4, 5, 3, 6] random.shuffle(item) print(item) |
|
隨機驗證碼 例:生成5位隨機碼 |
import random def v_code(): code = '' for i in range(5): num = random.randint(0, 9) alf = chr(random.randint(65, 90)) add = random.choice([num, alf]) code = "".join([code, str(add)]) return code print(v_code()) |
NK4XV |
4、OS模塊:os模塊是與操作系統交互的一個接口 | ||
用法 | 栗子 | 結果 |
# OS 模塊與操作系統交互的一個接口 # 可生成多層遞歸目錄 # os.makedirs('dirname1/dirname2') # 若目錄爲空,則刪除,並遞歸到上一級目錄, # 如若也爲空,則刪除,依此類推 # os.removedirs('dirname1') # 生成單級目錄;相當於shell中mkdir dirname # os.mkdir('dirname') # 刪除單級空目錄,若目錄不爲空則無法刪除,報錯; # os.rmdir('dirname') # 列出指定目錄下的所有文件和子目錄, # 包括隱藏文件,並以列表方式打印 # os.listdir('dirname') # 刪除一個文件 # os.remove() # 重命名文件/目錄 # os.rename("oldname","newname") # 獲取文件/目錄信息 # os.stat('path/filename') # 運行shell命令 直接顯示 # os.system('bash command') # 運行shell命令,獲取執行結果 # os.popen("bash command).read() |
||
# 獲取當前工作目錄 print(os.getcwd()) # 改變當前腳本工作目錄;相當於shell下cd os.chdir(r'E:\pytext\003') print(os.getcwd()) os.chdir(r'E:\pytext\002') print(os.getcwd()) |
E:\pytext\002 E:\pytext\003 E:\pytext\002 |
|
os.path 模塊 | # 返回path規範化的絕對路徑 # os.path.abspath(path) # 將path分割成目錄和文件名二元組返回 # os.path.split(path) # 返回path的目錄。其實就是os.path.split(path)的第一個元素 # os.path.dirname(path) # 返回path最後的文件名。如何path以/或\結尾, # 那麼就會返回空值。即os.path.split(path)的第二個元素 # os.path.basename(path) # 如果path存在,返回True;如果path不存在,返回False # os.path.exists(path) # 如果path是絕對路徑,返回True # os.path.isabs(path) # 如果path是一個存在的文件,返回True。否則返回False # os.path.isfile(path) # 如果path是一個存在的目錄,則返回True。否則返回False # os.path.isdir(path) # 將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略 # os.path.join(path1[, path2[, ...]]) # 返回path所指向的文件或者目錄的最後訪問時間 # os.path.getatime(path) # 返回path所指向的文件或者目錄的最後修改時間 # os.path.getmtime(path) # 返回path的大小 # os.path.getsize(path) |
|
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)是創建時間 |
|
# # 輸出操作系統特定的路徑分隔符 print(os.sep) # # 輸出當前平臺使用的行終止符 print(os.linesep) # 輸出用於分割文件路徑的字符串 print(os.pathsep) # 輸出字符串指示當前使用平臺 print(os.name) |
\ ; nt |
|
5、sys模塊是與python解釋器交互的一個接口 | ||
# 返回操作系統平臺名稱 print(sys.platform) |
||
# # 獲取Python解釋程序的版本信息 print(sys.version) |
||
# # 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值 print(sys.path) |
||
sys.argv | ||
6、序列化:將原本的字典、列表等內容轉換成一個字符串的過程就叫做序列化 | ||
序列化目的:1>以某種存儲形式使自定義對象持久化; 2>將對象從一個地方傳遞到另一個地方。 3>使程序更具維護性 |
||
json,用於字符串 和 python數據類型間進行轉換 | ||
json是一種所有的語言都可以識別的數據結構。 | ||
pickle,用於python特有的類型 和 python的數據類型間進行轉換 | ||
用法 | 栗子 | 結果 |
json 字典轉換成字符串 loads和dumps |
# # 將一個字典轉換成一個字符串 dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} str_dic = json.dumps(dic) print(str_dic, type(str_dic)) # 反序列化:將字符串格式的字典轉化爲字典 dic2 = json.loads(str_dic) print(dic2, type(dic2)) |
{"k1": "v1", "k2": "v2", "k3": "v3"} <class 'str'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} <class 'dict'> |
json dump和load |
# dump 接收文件句柄,直接將字典轉成json字符串寫入文件 import json f = open('json_file', 'w') dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} json.dump(dic, f) f.close() # load接收文件句柄,將文件中的json字符串轉成數據結構 f = open('json_file') dic2 = json.load(f) f.close() print(dic2, type(dic2)) |
json_file文件及內容 {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} <class 'dict'> |
json dumps ensure_ascii參數 |
import json f = open('file', 'w') json.dump({'國籍': '中國'}, f) ret = json.dumps({'國籍': '中國'}) f.write(ret+'\n') json.dump({'國籍': '美國'}, f, ensure_ascii=False) ret = json.dumps({'國籍': '美國'}, ensure_ascii=False) f.write(ret+'\n') f.close() |
|
其他參數 | ||
json Json的格式化輸出 indent 空幾格 |
import json data = {'username': ['李華', '二愣子'], 'sex': 'male', 'age': 16} json_dic2 = json.dumps(data, sort_keys=True, indent=2, separators=(',', ':'), ensure_ascii=False) print(json_dic2) |
{ "age":16, "sex":"male", "username":[ "李華", "二愣子" ] } |
pickle dumps 和 loads |
import pickle # dumps dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} str_dic = pickle.dumps(dic) # 轉成bytes類型數據 print(str_dic, type(str_dic)) # loads 反序列化、讀 dic2 = pickle.loads(str_dic) print(dic2) |
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.' <class 'bytes'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} |
pickle dump和lload |
import time struct_time = time.localtime(1800000000) print(struct_time) f = open('pickle_file', 'wb') # dump 序列化存 pickle.dump(struct_time, f) f.close() # load(不僅可以序列化字典,列表... # 還可以把python中任意的數據類型序列化) f = open('pickle_file', 'rb') struct_time2 = pickle.load(f) print(struct_time2.tm_year) |
|
7、re模塊:正則表達式方法模塊,擁有全部的正則表達式功能 | <------獲取匹配的函數 | |
group(num=0) | 匹配的整個表達式的字符串,group() 可以一次輸入多個組號, 在這種情況下它將返回一個包含那些組所對應值的元組。 |
|
groups() | 返回包含所有小組字符串的元組,從1到所含的小組 | |
groupdict() | 返回以有別名的組的別名爲鍵、以該組截獲的子串爲值的字典 | |
start() | 返回匹配開始的位置 | |
end() | 返回匹配結束的位置 | |
span() | 返回一個元組包含匹配(開始,結束)的位置 | |
findall | # findall 返回所有滿足匹配條件的結果,放在列表 """ findall(pattern, string, flags=0): pattern:匹配的正則表達式 string:要匹配的字符串 flags:標記爲,用於控制正則表達式的匹配方式 """ ret = re.findall('l', 'lion simba trglion') print(ret) |
['l', 'l'] |
findall 的優先級查詢 | ret = re.findall('www.(baidu|csdn).com', 'www.csdn.com') print(ret) # 如果想要匹配結果,取消權限即可 ret = re.findall('www.(?:baidu|csdn).com', 'www.csdn.com') print(ret) |
['csdn'] ['www.csdn.com'] |
finditer | # finditer返回所有滿足RE的結果,存放結果在迭代器 """ finditer(pattern, string, flags=0) pattern:匹配的正則表達式 string:要匹配的字符串 flags:標記爲,用於控制正則表達式的匹配方式 """ ret = re.finditer('\d', 'ds3sy4784a') print(ret) print(next(ret).group()) print(next(ret).group()) print([i.group() for i in ret]) |
<callable_iterator object at 0x0000022C0CFDD358> 3 4 ['7', '8', '4'] |
search | # search 掃描整個字符串並返回第一個成功的匹配 """ search(pattern, string, flags=0) pattern:匹配的正則表達式 string:要匹配的字符串 flags:標記爲,用於控制正則表達式的匹配方式 """ ret = re.search('l', 'lion simba trglion') ret1 = re.search('l', 'lion simba trglion').group() # 如果字符串沒有匹配會報錯 # ret2 = re.search('c', 'lion simba trglion').group() ret3 = re.search('c', 'lion simba trglion') print(ret, '\nret1:', ret1, '\nret3:', ret3) |
<_sre.SRE_Match object; span=(0, 1), match='l'> ret1: l ret3: None |
match | # match 從字符串的起始位置匹配, # 如果起始位置匹配不成功的話,match()就返回none """ match(pattern, string, flags=0) pattern:匹配的正則表達式 string:要匹配的字符串 flags:標記爲,用於控制正則表達式的匹配方式 """ ret = re.match('a', 'abc') ret1 = re.match('a', 'abc').group() ret2 = re.match('b', 'abc') print(ret, '\nret1:', ret1, '\nret2:', ret2) |
<_sre.SRE_Match object; span=(0, 1), match='a'> ret1: a ret2: None |
split | # split 按照匹配的子串將字符串分割後返回列表 """ split(pattern, string, maxsplit=0, flags=0) pattern:匹配的正則表達式 string:要匹配的字符串 maxsplit: 分割次數,默認爲0 不限制次數 flags:標記爲,用於控制正則表達式的匹配方式 """ ret = re.split('[ab]', 'abcd') ret1 = re.split('[ab]', 'abcd', 1) ret2 = re.split('[ab]', 'aAcd') # re.I 是正則表達式修飾符,使匹配對大小寫不敏感 ret3 = re.split('[ab]', 'aAcd', flags=re.I) print('ret:', ret, '\nret1:', ret1, '\nret2:', ret2, '\nret3:', ret3,) |
ret: ['', '', 'cd'] ret1: ['', 'bcd'] ret2: ['', 'Acd'] ret3: ['', '', 'cd'] |
split的優先級查詢 | # split的優先級查詢 有無() 的結果大不同 ret = re.split("\d+", "eva3egon4yuan") print(ret) ret = re.split("(\d+)", "eva3egon4yuan") print(ret) |
['eva', 'egon', 'yuan'] ['eva', '3', 'egon', '4', 'yuan'] |
sub | # sub 替換匹配到的字符串 """ sub(pattern, repl, string, count=0, flags=0) pattern:匹配的正則表達式 repl:替換爲字符串,也可作爲一個函數 string:要匹配的字符串 count:模式匹配後替換的最大次數,默認0表示替換所有匹配 flags:標記爲,用於控制正則表達式的匹配方式 """ ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1) print('ret :', ret) ret1 = re.sub('\d', 'h', ret, 1) print('ret1:', ret1) ret2 = re.sub('a', 'W', ret, 3) print('ret2:', ret2) ret3 = re.sub('H', '5', ret1) print('ret3:', ret3) ret4 = re.sub('H', '5', ret1, flags=re.I) print('ret4:', ret4) |
ret : evaHegon4yuan4 ret1: evaHegonhyuan4 ret2: evWHegon4yuWn4 ret3: eva5egonhyuan4 ret4: eva5egon5yuan4 |
subn | # subn 替換匹配到的字符串返回元組(替換結果,替換次數) """ subn(pattern, repl, string, count=0, flags=0) """ ret = re.subn('\d', 'H', 'eva3egon4yuan4') print(ret) |
('evaHegonHyuanH', 3) |
compile | # compile 編譯正則表達式,生成一個正則表達式(Pattern)對象 # 供 match() 和 search() 這兩個函數使用 """ compile(pattern, flags=0): """ # 將正則表達式編譯成爲一個 正則表達式對象,規則要匹配的是3個數字 obj = re.compile('\d{3}') obj = re.compile('\d{2}') # 正則表達式對象調用search,參數爲待匹配的字符串 ret = obj.search('4a5b6c123eeee') ret1 = obj.match('4a5b6c123eeee') ret3 = obj.match('44a5b6c123eeee') print(ret.group(), ret1, ret3.group()) |
12 None 44 |
練習 | ||
8、hashlib模塊:提供了常見的摘要算法,如MD5,SHA1等,摘要算法又稱哈希算法、散列算法 | ||
# MD5值計算 | # MD5值計算 m = hashlib.md5() m.update("ling".encode("utf-8")) print(m.hexdigest()) # md5計算 nm5 = hashlib.new('md5', "ling".encode("utf-8")).hexdigest() print(nm5) # ‘加鹽’ m1 = hashlib.md5("1234567".encode("utf-8")) m1.update("ling".encode("utf-8")) print(m1.hexdigest()) # sha1計算 hs = hashlib.sha1() hs.update("ling".encode("utf-8")) print(hs.hexdigest()) # sha256 計算 hs1 = hashlib.sha256() hs1.update("ling".encode("utf-8")) print(hs1.hexdigest()) # hmac的使用 h = hmac.new("1234567".encode("utf-8"), "ling".encode("utf-8"), digestmod='md5') print(h.hexdigest()) h1 = hmac.new("1234567".encode("utf-8")) h1.update("ling".encode("utf-8")) print(h1.hexdigest()) |
24c10be286b009f797d53126790fcfd8 24c10be286b009f797d53126790fcfd8 adf67c5212bc655192931cb54efd3111 3275142b880fd39f1dbd64201d4e22e370d61f98 6cd4c9c389b460a1f60357bebdec27a788c4abbf1aa3dead4d3c0cfd0cebea2a 1154278ab2838e38d54270bcbaedf989 1154278ab2838e38d54270bcbaedf989 |
9、configparser模塊: | ||
# 生成配置文檔 config = configparser.ConfigParser() config["DEFAULT"] = {'ServerAliveInterval': '45', 'Compression': 'yes', 'CompressionLevel': '9', 'ForwardX11': 'yes' } config['bitbucket.org'] = {'User': 'hg'} config['topsecret.server.com'] = {'Host Port': '50022', 'ForwardX11': 'no'} with open('example.ini', 'w') as configfile: config.write(configfile) |
[DEFAULT] serveraliveinterval = 45 compression = yes compressionlevel = 9 forwardx11 = yes [bitbucket.org] user = hg [topsecret.server.com] host port = 50022 forwardx11 = no |
|
# 讀取和查找文件 # 查找文件內容,基於字典的形式 config = configparser.ConfigParser() print(config.sections()) # 讀取 config.read('example.ini') print(config.sections()) print('bytebong.com' in config) print('bitbucket.org' in config) print(config['bitbucket.org']["user"]) print(config['DEFAULT']['Compression']) print(config['topsecret.server.com']['ForwardX11']) print(config['bitbucket.org']) # 注意,有default會默認default的鍵 for key in config['bitbucket.org']: print(key) print(config.options('bitbucket.org')) # 同for循環 # 找到'bitbucket.org'下所有鍵值對 print(config.items('bitbucket.org')) # get方法Section下的key對應的value print(config.get('bitbucket.org','compression')) |
[] ['bitbucket.org', 'topsecret.server.com'] False True hg yes no <Section: bitbucket.org> user serveraliveinterval compression compressionlevel forwardx11 ['user', 'serveraliveinterval', 'compression', 'compressionlevel', 'forwardx11'] [('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('forwardx11', 'yes'), ('user', 'hg')] yes |
|
未成功 | # 增刪改操作 config = configparser.ConfigParser() config.read('example.ini') config.add_section('yuan') config.remove_section('bitbucket.org') config.remove_option('topsecret.server.com', "forwardx11") config.set('topsecret.server.com', 'k1', '11111') config.set('yuan', 'k2', '22222') config.write(open('new2.ini', "w")) |
|
10、logging日誌模塊 | ||
函數 | 說明 | |
logging.debug(msg, *args, **kwargs) | 創建一條嚴重級別爲DEBUG的日誌記錄 | |
logging.info(msg, *args, **kwargs) | 創建一條嚴重級別爲INFO的日誌記錄 | |
logging.warning(msg, *args, **kwargs) | 創建一條嚴重級別爲WARNING的日誌記錄 | |
logging.error(msg, *args, **kwargs) | 創建一條嚴重級別爲ERROR的日誌記錄 | |
logging.critical(msg, *args, **kwargs) | 創建一條嚴重級別爲CRITICAL的日誌記錄 | |
logging.log(level, *args, **kwargs) | 創建一條嚴重級別爲level的日誌記錄 | |
logging.basicConfig(**kwargs) | 對root logger進行一次性配置 | |
""" 日誌級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG 默認只顯示了大於等於WARNING級別的日誌, """ logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message') |
WARNING:root:warning message ERROR:root:error message CRITICAL:root:critical message |
|
logging.basicConfig() | # logging.basicConfig()函數調整日誌級別、輸出格式 logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(name)s %(levelname)s %(message)s", datefmt='%Y-%m-%d %H:%M:%S %a' ) logging.debug("msg1") logging.info("msg2") logging.warning("msg3") logging.error("msg4") logging.critical("msg5") |
|
# 生成日誌文件 # 配置輸出日誌格式 LOG_FORMAT = "%(asctime)s %(name)s %(levelname)s %(pathname)s %(message)s" # 配置輸出時間的格式,注意月份和天數 DATE_FORMAT = '%Y-%m-%d %H:%M:%S %a' # 利用filename參數將日誌內容直接寫入文件 logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt=DATE_FORMAT, filename=r"E:/pytext/002/test.log" ) logging.debug("msg1") logging.info("msg2") logging.warning("msg3") logging.error("msg4") logging.critical("msg5") |
||
日誌的切割 | 欠 | |
logging模塊中定義好的可以用於format格式字符串說明 | ||
字段/屬性名稱 | 描述 | 使用格式 |
asctime | 將日誌的時間構造成可讀的形式,默認情況下是‘2016-02-08 12:00:00,123’精確到毫秒 | %(asctime)s |
name | 所使用的日誌器名稱,默認是'root',因爲默認使用的是 rootLogger | %(name)s |
filename | 調用日誌輸出函數的模塊的文件名; pathname的文件名部分,包含文件後綴 | %(filename)s |
funcName | 由哪個function發出的log, 調用日誌輸出函數的函數名 | %(funcName)s |
levelname | 日誌的最終等級(被filter修改後的) | %(levelname)s |
message | 日誌信息, 日誌記錄的文本內容 | %(message)s |
lineno | 當前日誌的行號, 調用日誌輸出函數的語句所在的代碼行 | %(lineno)d |
levelno | 該日誌記錄的數字形式的日誌級別(10, 20, 30, 40, 50) | %(levelno)s |
pathname | 完整路徑 ,調用日誌輸出函數的模塊的完整路徑名,可能沒有 | %(pathname)s |
process | 當前進程, 進程ID。可能沒有 | %(process)s |
processName | 進程名稱,Python 3.1新增 | %(processName)s |
thread | 當前線程, 線程ID。可能沒有 | %(thread)s |
threadName | 線程名稱 | %(thread)s |
module | 調用日誌輸出函數的模塊名, filename的名稱部分,不包含後綴即不包含文件後綴的文件名 | %(module)s |
created | 當前時間,用UNIX標準的表示時間的浮點數表示; 日誌事件發生的時間--時間戳,就是當時調用time.time()函數返回的值 | %(created)f |
relativeCreated | 輸出日誌信息時的,自Logger創建以 來的毫秒數; 日誌事件發生的時間相對於logging模塊加載時間的相對毫秒數 | %(relativeCreated)d |
msecs | 日誌事件發生事件的毫秒部分。logging.basicConfig()中用了參數datefmt,將會去掉asctime中產生的毫秒部分,可以用這個加上 | %(msecs)d |
元字符 | ||
量詞 | 量詞用法說明 * 重複零次或更多次 + 重複一次或更多次 ? 重複零次或一次 {n} 重複n次 {n,} 重複n次或更多次 {n,m} 重複n到m次 |
願有更多的朋友,在網頁筆記結構上分享更邏輯和易讀的形式:
鏈接:暫無
提取碼:暫無