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']
(2)獲取指定節點下的鍵值對服務器
import configparser config = configparser.ConfigParser() config.read('xx', encoding='utf-8') ret = config.items('tina') print(ret) ######指定文件依然用上面例子中的,執行結果以下:######### [('k2', '34.5'), ('k1', '11111')]
(3)獲取指定節點下全部的鍵ide
import configparser config = configparser.ConfigParser() config.read('xx', encoding='utf-8') ret = config.options('tina') print(ret)
(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,錯誤則報錯
(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'))
高級的文件、文件夾、壓縮包處理(對壓縮包的處理須要調用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解壓縮
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 支持以下幾個關鍵字參數:
深刻了解,點擊: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.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) 日誌(二)
如上述建立的兩個日誌對象