模塊(configparser+shutil+logging)

1、configparser模塊

一、模塊介紹

configparser用於處理特定格式的文件,其本質上是利用open來操做文件。html

*注:(這裏解釋一下特定格式的文件)python

a、有section和option的格式,且section表現爲列表形式,option表現爲字典形式。web

# 註釋1
;  註釋2
 
[section1] # 節點
k1 = v1    #
k2:v2       #
 
[section2] # 節點
k1 = v1    #

指定格式
特定格式說明

舉例:windows

[tina]
k2 = 34.5
k1 = 11111

[tony]
"k2" = 'vi'
"k1" = 've'

[tom]
"k2" = 'cw'
"k1" = 'de'
特定格式

b、目前見過的只有Linux中的Samba配置文件api

二、模塊經常使用功能

(1)獲取文件中的全部節點安全

import configparser
 
config = configparser.ConfigParser()
config.read('xx', encoding='utf-8')
ret = config.sections()
print(ret)

#########如下是XX文件中的內容###########
[tina]
k2 = 34.5
k1 = 11111

[tony]
"k2" = 'vi'
"k1" = 've'

[tom]
"k2" = 'cw'
"k1" = 'de'

############最後的執行結果############
['tina', 'tony', 'tom']
獲取xx文件中的全部節點

(2)獲取指定節點下的鍵值對服務器

import configparser
 
config = configparser.ConfigParser()
config.read('xx', encoding='utf-8')
ret = config.items('tina')
print(ret)

######指定文件依然用上面例子中的,執行結果以下:#########
[('k2', '34.5'), ('k1', '11111')]
獲取XX文件中指定節點tina下的鍵值對

(3)獲取指定節點下全部的鍵ide

import configparser
 
config = configparser.ConfigParser()
config.read('xx', encoding='utf-8')
ret = config.options('tina')
print(ret)
獲取XX文件下指定節點tina下全部的鍵

(4)獲取指定節點下指定key的值函數

import configparser
 
config = configparser.ConfigParser()
config.read('xx', encoding='utf-8')
 
 
v = config.get('section1', 'k1')
# v = config.getint('section1', 'k1')
# v = config.getfloat('section1', 'k1')
# v = config.getboolean('section1', 'k1')
 
print(v)#根據值的數據類型不一樣,選擇不一樣類型get,錯誤則報錯
只獲取key對應的值

(5)檢查(判斷)、刪除、添加節點post

import configparser
 
config = configparser.ConfigParser()
config.read('xx', encoding='utf-8')
 
 
# 檢查
has_sec = config.has_section('section1')
print(has_sec)
 
# 添加節點
config.add_section("tina")
config.write(open('xx', 'w'))
 
# 刪除節點
config.remove_section("tina")
config.write(open('xx', 'w')
對節點的檢查、刪除、添加操做

(6)檢查、刪除、設置指定組內的鍵值對

import configparser
 
config = configparser.ConfigParser()
config.read('xx', encoding='utf-8')
 
# 檢查
has_opt = config.has_option('section1', 'k1')
print(has_opt)
 
# 刪除
config.remove_option('section1', 'k1')
config.write(open('xx', 'w'))
 
# 設置
config.set('section1', 'k10', "123")
config.write(open('xx', 'w'))
對指定組內的鍵值對的操做

 2、shutil模塊

高級的文件、文件夾、壓縮包處理(對壓縮包的處理須要調用ZipFile 和 TarFile模塊)的模塊

一、模塊經常使用功能

 copyfile( src, dst)  從源src複製到dst中去。固然前提是目標地址是具有可寫權限。拋出的異常信息爲IOException. 若是當前的dst已存在的話就會被覆蓋掉
 copymode( src, dst)  只是會複製其權限其餘的東西是不會被複制的
 copystat( src, dst)  複製權限、最後訪問時間、最後修改時間
 copy( src, dst)     複製一個文件到一個文件或一個目錄
 copy2( src, dst)   在copy上的基礎上再複製文件最後訪問時間與修改時間也複製過來了,相似於cp –p的東西
 copy2( src, dst)   若是兩個位置的文件系統是同樣的話至關因而rename操做,只是更名;若是是不在相同的文件系統的話就是作move操做
 copytree(olddir,newdir,True/Flase)  把olddir拷貝一份newdir,若是第3個參數是True,則複製目錄時將保持文件夾下的符號鏈接,若是第3個參數是False,則將在複製的目錄下生成物理副原本替代符號鏈接

展開說明:

(1)shutil.copyfileobj(fsrc,fdst[,length])#將文件內容拷貝(覆蓋)到另外一個文件中

import shutil
shutil.copyfileobj(open('log.log','r'),open('db','w'))

(2)shutil.copyfile(src,dst)#拷貝文件

import shutil
# shutil.copyfileobj(open('log.log','r'),open('db','w'))
#執行結果是db中的文件內容被log文件中的內容覆蓋掉了
shutil.copyfile('db','db2')
#執行結果是,新建立了一個db2文件,其內容和db中同樣
拷貝文件的栗子

(3)shutil.copymode(src,dst)#僅拷貝權限。內容、組、用戶均不變。

shutil.copymode('文件1','文件2')#僅拷貝權限,內容、組、用戶均不變。
#############廢話多一些更好理解,哈哈###############
文件1和文件2中都有內容,shutil.copymode後文件1和文件2中的內容還爲原來各自的內容,拷貝的僅僅是文件權限,在Linux中可能用的比較多。

 (4)shutil.copystat(src,dst)#拷貝狀態的信息,包括:mode bits,atime,mtime,flags

shutil.copystat('f1.log', 'f2.log')

(5)shutil.copy(src,dst)#拷貝文件和權限

import shutil
shutil.copy('f1.log', 'f2.log')

(6)shutil.copy2(src,dst)#拷貝文件和狀態信息

import shutil
shutil.copy2('f1.log', 'f2.log')

(7)shutil.ignore_patterns(*patterns)

shutil.copytree(src,dst,symlinks=False,ignore=None)#遞歸的拷貝文件夾

import shutil
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
import shutil
shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))

(8)shutil.move(src,dst)#遞歸的去移動文件,相似mv命令,其實就是重命名

import shutil 
shutil.move('folder1', 'folder3')

(9)shutil.make_archive(base_name,format,...)#建立壓縮包並返回文件路徑,例如:zip,tar

base_name: 壓縮包的文件名,也能夠是壓縮包的路徑。只是文件名時,則保存至當前目錄,不然保存至指定路徑,
如:feifei                        =>保存至當前路徑
如:/Users/tina/feifei =>保存至/Users/tina/
format:	壓縮包種類,「zip」, 「tar」, 「bztar」,「gztar」
root_dir:	要壓縮的文件夾路徑(默認當前目錄)
owner:	用戶,默認當前用戶
group:	組,默認當前組
logger:	用於記錄日誌,一般是logging.Logger對象
#將 /Users/tina/Downloads/test 下的文件打包放置當前程序目錄
import shutil
ret = shutil.make_archive("feifei", 'gztar', root_dir='/Users/tina/Downloads/test')
  
  
#將 /Users/tina/Downloads/test 下的文件打包放置 /Users/wupeiqi/目錄
import shutil
ret = shutil.make_archive("/Users/wupeiqi/feifei", 'gztar', root_dir='/Users/tina/Downloads/test')

 二、shutil模塊與ZipFile 和 TarFile模塊的關係

shutil模塊經常和ZipFile 和 TarFile這兩個模塊一塊兒使用,用來對壓縮包的處理

import zipfile

# 壓縮
z = zipfile.ZipFile('tina.zip', 'w')
z.write('a.log')
z.write('data.data')
z.close()

# 解壓
z = zipfile.ZipFile('tina.zip', 'r')
z.extractall()
z.close()

zipfile解壓縮
import tarfile

# 壓縮
tar = tarfile.open('your.tar','w')
tar.add('/Users/tina/PycharmProjects/bbs2.log', arcname='bbs2.log')
tar.add('/Users/tina/PycharmProjects/cmdb.log', arcname='cmdb.log')
tar.close()

# 解壓
tar = tarfile.open('your.tar','r')
tar.extractall()  # 可設置解壓地址
tar.close()

tarfile解壓縮

3、logging模塊

logging模塊是用來記錄日誌且保證線程安全的模塊。

logging模塊支持將日誌信息保存到不一樣的目標域中,如:保存到日誌文件中;以郵件的形式發送日誌信息;以http get或post的方式提交日誌到web服務器;以windows事件的形式記錄等等。這些日誌保存方式能夠組合使用,每種方式能夠設置本身的日誌級別以及日誌格式。

一、單文件日誌

import logging
logging.basicConfig(filename='log.log',
                    format='%(asctime)s-%(name)s-%(levelname)s-%(module)s:%(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p',
                    level=10)
logging.debug('d')
logging.info('i')
logging.warning('w')
logging.error('e')
logging.critical('c')
logging.log(10,'log')
########執行結果:生成一個log日誌文件,內容以下:##########

2016-05-26 14:58:29 PM-root-DEBUG-module:d
2016-05-26 14:58:29 PM-root-INFO-module:i
2016-05-26 14:58:29 PM-root-WARNING-module:w
2016-05-26 14:58:29 PM-root-ERROR-module:e
2016-05-26 14:58:29 PM-root-CRITICAL-module:c
2016-05-26 14:58:29 PM-root-DEBUG-module:log

注:只有【當前寫等級】大於等於【日誌等級】時,日誌文件才被記錄。

日誌等級:

CRITICAL = 50
FATAL = CRITICAL ERROR = 40 WARNING = 30 WARN = WARNING INFO = 20 DEBUG = 10 NOTSET = 0

注:能夠給日誌對象(Logger Instance)設置日誌級別,低於該級別的日誌消息將會被忽略,也能夠給Hanlder設置日誌級別,對於低於該級別的日誌消息, Handler也會忽略。

 

import logging
logging.basicConfig(filename = os.path.join(os.getcwd(), 'log.txt'), level = logging.DEBUG)
logging.debug('this is a message')

運行上面例子的代碼,將會在程序的根目錄下建立一個log.txt文件,打開該文件,裏面有一條日誌記錄:」DEBUG:root:this is a message」。
4個主要的組件
logger: 日誌類,應用程序每每經過調用它提供的api來記錄日誌;
handler: 對日誌信息處理,能夠將日誌發送(保存)到不一樣的目標域中;
filter: 對日誌信息進行過濾;
formatter:日誌的格式化,即日誌記錄的格式;

a、loggers

Logger.setLevel(lel):指定最低的日誌級別,低於lel的級別將被忽略。debug是最低的內置級別,critical爲最高
Logger.addFilter(filt)、Logger.removeFilter(filt):添加或刪除指定的filter
Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增長或刪除指定的handler
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():能夠設置的日誌級別

b、Handlers

handler對象負責發送相關的信息到指定目的地。能夠經過addHandler()方法添加多個多handler
Handler.setLevel(lel):指定被處理的信息級別,低於lel級別的信息將被忽略
Handler.setFormatter():給這個handler選擇一個格式
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或刪除一個filter對象

c、filters

d、Formatter對象設置日誌信息最後的規則、結構和內容,默認的時間格式爲%Y-%m-%d %H:%M:%S,下面是Formatter經常使用的一些信息

%(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

用戶輸出的消息

logging模塊中的經常使用函數:

logging.basicConfig([**kwargs]):

爲日誌模塊配置基本信息。kwargs 支持以下幾個關鍵字參數:

    • filename :日誌文件的保存路徑。若是配置了些參數,將自動建立一個FileHandler做爲Handler;
    • filemode :日誌文件的打開模式。 默認值爲'a',表示日誌消息以追加的形式添加到日誌文件中。若是設爲'w', 那麼每次程序啓動的時候都會建立一個新的日誌文件;
    • format :設置日誌輸出格式;
    • datefmt :定義日期格式;
    • level :設置日誌的級別.對低於該級別的日誌消息將被忽略;
    • stream :設置特定的流用於初始化StreamHandler;

深刻了解,點擊:http://www.jb51.net/article/50368.htm,http://www.jb51.net/article/68133.htm,http://blog.csdn.net/yatere/article/details/6655445

需求:開發一個日誌系統, 既要把日誌輸出到控制檯, 還要寫入日誌文件,參考文章:http://www.jb51.net/article/42626.htm

logging模塊源碼介紹:
https://docs.python.org/2/library/logging.html
# -*- coding: utf-8 -*-
"""
A simple fibonacci program
"""
import argparse
parser = argparse.ArgumentParser(description='I print fibonacci sequence')
parser.add_argument('-s', '--start', type=int, dest='start',
                    help='Start of the sequence', required=True)
parser.add_argument('-e', '--end', type=int, dest='end',
                    help='End of the sequence', required=True)
parser.add_argument('-v', '--verbose', action='store_true', dest='verbose',
                    help='Enable debug info')
import logging
logger = logging.getLogger('fib')
logger.setLevel(logging.DEBUG)
hdr = logging.StreamHandler()
formatter = logging.Formatter('[%(asctime)s] %(name)s:%(levelname)s: %(message)s')
hdr.setFormatter(formatter)
logger.addHandler(hdr)

def infinite_fib():
    a, b = 0, 1
    yield a
    yield b
    while True:
        logger.debug('Before caculation: a, b = %s, %s' % (a, b))
        a, b = b, a + b
        logger.debug('After caculation: a, b = %s, %s' % (a, b))
        yield b

def fib(start, end):
    for cur in infinite_fib():
        logger.debug('cur: %s, start: %s, end: %s' % (cur, start, end))
        if cur > end:
            return
        if cur >= start:
            logger.debug('Returning result %s' % cur)
            yield cur
def main():
    args = parser.parse_args()
    if args.verbose:
        logger.setLevel(logging.DEBUG)
    else:
        logger.setLevel(logging.ERROR)
    for n in fib(args.start, args.end):
        print n,
if __name__ == '__main__':
    main()
用logging模塊的斐波那契數列

 

 

二、多文件日誌

對於上述記錄日誌的功能,只能將日誌記錄在單文件中,若是想要設置多個日誌文件,logging.basicConfig將沒法完成,須要自定義文件和日誌操做對象。

# 定義文件
file_1_1 = logging.FileHandler('l1_1.log', 'a')
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s")
file_1_1.setFormatter(fmt)

file_1_2 = logging.FileHandler('l1_2.log', 'a')
fmt = logging.Formatter()
file_1_2.setFormatter(fmt)

# 定義日誌
logger1 = logging.Logger('s1', level=logging.ERROR)
logger1.addHandler(file_1_1)
logger1.addHandler(file_1_2)


# 寫日誌
logger1.critical('1111')

日誌(一)
日誌一
# 定義文件
file_2_1 = logging.FileHandler('l2_1.log', 'a')
fmt = logging.Formatter()
file_2_1.setFormatter(fmt)

# 定義日誌
logger2 = logging.Logger('s2', level=logging.INFO)
logger2.addHandler(file_2_1)

日誌(二)
日誌二

 

如上述建立的兩個日誌對象

  • 當使用【logger1】寫日誌時,會將相應的內容寫入 l1_1.log 和 l1_2.log 文件中
  • 當使用【logger2】寫日誌時,會將相應的內容寫入 l2_1.log 文件中
相關文章
相關標籤/搜索