python基礎(11)-經常使用模塊

re(正則)模塊

經常使用方法

  • findall()

    以列表返回全部知足條件的結果python

    1 import  re
    2 print(re.findall('\d','a1b2c2abc123'))#['1', '2', '2', '1', '2', '3']
    View Code
  • search()

    查找到第一個匹配信息就返回一個包含匹配信息的對象(未找到時返回None),該對象經過group()函數查看結果正則表達式

    1 import re
    2 
    3 str = 'a1b2c2abc123'
    4 print(re.search('\d', str).group())  # 1
    View Code
  • match()

    從字符串開始位置匹配,其它同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
    View Code
  • split()

    以正則匹配到的字符切割字符串,返回切割後的字符串列表json

    1 import re
    2 
    3 str = 'a1b2c2abc123'
    4 print(re.split('[123]', str))  # ['a', 'b', 'c', 'abc', '', '', '']
    View Code
  • sub()

    將匹配到的內容替換爲指定內容,返回替換後的字符串()bash

    1 import re
    2 
    3 str = 'a1b2c2abc123'
    4 print(re.sub('[123]', 'A', str))  # aAbAcAabcAAA
    View Code
  • subn()

    將匹配到的內容替換爲指定內容,返回元祖.第一個值是替換後的字符串,第二個值是替換的次數數據結構

    1 import re
    2 
    3 str = 'a1b2c2abc123'
    4 print(re.subn('[123]', 'A', str))  # ('aAbAcAabcAAA', 6)
    View Code
  • compile()

    將正則表達式編譯爲字節碼對象,可屢次調用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
    View Code
  • finditer()

    返回一個存放匹配結果的迭代器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']
    View Code

優先級問題

  • findall()

    findall會優先把組匹配結果內容返回ide

    ?: 可取消優先返回組匹配結果函數

    1 import re
    2 
    3 print(re.findall('zz([a-y])', 'zze'))  # ['e']
    4 print(re.findall('zz(?:[a-y])', 'zze'))  # ['zze']
    View Code
  • split()

    當正則包含組時,切割結果會保留分割內容

    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', '']
    View Code

擴展

  • 組命名

    可經過'?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>
    View Code

collections模塊

新增的數據類型

  • namedtuple:帶名稱的元組

    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
    View Code 
  • deque:雙向隊列

     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])
    View Code
  • OrderedDict:有序字典

     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
    View Code
  • defaultdict:默認字典

    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 不存在時使用默認值
    View Code
  • Counter:計數器

    1 from collections import Counter
    2 
    3 c = Counter('abcdeabcdabcaba')
    4 print(c)  # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
    View Code

time(時間)模塊

表示時間的三種方式

  • 時間戳(timestamp)

    一般來講,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量運行「type(time.time())」,返回的是float類型

  • 格式化的時間字符串(Format String)

    如:'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)

    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

使用

  • 時間戳(timestamp)

    1 import time
    2 print(time.time())  # 1535813663.732
    View Code
  • 格式化的時間字符串(Format String)

    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
    View Code
  • 元組(struct_time)

    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)
    View Code

轉換

  • 時間戳(timestamp)和結構化時間(struct_time)

    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
    View Code
  • 格式化的時間字符串(timestamp)和結構化時間(struct_time)

     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)
    View Code

例子

  • 計算時間差

    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))
    View Code

random(隨機數)模塊

使用

  • 隨機小數

    1 import random
    2 
    3 print(random.random())  # 0.33630703804107664 大於0且小於1之間的小數
    4 print(random.uniform(1, 3))  # 2.0639651365332607 大於1小於3的小數
    View Code
  • 隨機整數

    1 import random
    2 
    3 print(random.randint(1,5))  # 2 大於等於1且小於等於5之間的整數
    4 print(random.randrange(1,10,2)) # 1 大於等於1且小於10之間的奇數
    View Code
  • 隨機選擇返回

    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]]
    View Code
  • 打亂次序

    1 import random
    2 
    3 item = [1, 2, 3, 4, 5]
    4 random.shuffle(item)  # 打亂次序
    5 print(item)  # [4, 2, 5, 3, 1]
    View Code

例子

  • 生成隨機驗證碼字符串

     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())
    View Code

os模塊

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

sys模塊是與python解釋器交互的一個接口

sys.argv           命令行參數List,第一個元素是程序自己路徑
sys.exit(n)        退出程序,正常退出時exit(0),錯誤退出sys.exit(1)
sys.version        獲取Python解釋程序的版本信息
sys.path           返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
sys.platform       返回操做系統平臺名稱

序列化模塊

序列化:將對象轉成字符串

反序列化:將字符串轉成對象

json

用於字符串和python數據類型間進行轉換

  • dumps()和loads()

    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'}]
    View Code
     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 # {"國籍": "美國"}{"國籍": "美國"}
    ensure_ascii
    參數說明:
    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 # }
    格式化輸出
  • dump()和load()

    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)
    View Code

pickle

用於python特有的類型和python的數據類型間進行轉換

  • dumps()和loads()

    序列化,將對象轉換爲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
    View Code
  • dump()和load()

    序列化,將對象轉換爲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
    View Code

shelve

經過文件句柄序列化同步到文件

 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()
View Code

hashlib模塊

md5和sha加密

 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
View Code

加鹽

 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
View Code

configparser模塊

建立配置文件

 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
View Code

查找

 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
View Code

增刪改

 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
View Code

logging模塊

默認

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') 
View Code

默認狀況下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
View Code

logger對象配置

 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
View Code

配置參數說明

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:用戶輸出的消息
相關文章
相關標籤/搜索