day6 python學習隨筆。

  1. 序列化

工具有json,pickle。

用於把複雜的數據類型轉換成字符串。

#json必須是 key,value的數據類型。

#pickle僅限python使用支持python大部分數據類型。


2.logging模塊

用於便捷記錄日誌且線程安全的模塊

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('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
logging.log(10,'log')

對於等級

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


只有大於當前日誌等級的操作纔會被記錄。

#coding:utf-8  
import logging

# 創建一個logger    
logger = logging.getLogger()

logger1 = logging.getLogger('mylogger')
logger1.setLevel(logging.DEBUG)

logger2 = logging.getLogger('mylogger')
logger2.setLevel(logging.INFO)  
  
logger3 = logging.getLogger('mylogger.child1')  
logger3.setLevel(logging.WARNING)  
  
logger4 = logging.getLogger('mylogger.child1.child2')  
logger4.setLevel(logging.DEBUG)  
  
logger5 = logging.getLogger('mylogger.child1.child2.child3')  
logger5.setLevel(logging.DEBUG)  
  
# 創建一個handler,用於寫入日誌文件    
fh = logging.FileHandler('/tmp/test.log')  
  
# 再創建一個handler,用於輸出到控制檯    
ch = logging.StreamHandler()  
  
# 定義handler的輸出格式formatter    
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  
fh.setFormatter(formatter)  
ch.setFormatter(formatter)


#定義一個filter  
#filter = logging.Filter('mylogger.child1.child2')  
#fh.addFilter(filter)    
  
# 給logger添加handler    
#logger.addFilter(filter)  
logger.addHandler(fh)
logger.addHandler(ch)

#logger1.addFilter(filter)  
logger1.addHandler(fh)
logger1.addHandler(ch)

logger2.addHandler(fh)
logger2.addHandler(ch)

#logger3.addFilter(filter)  
logger3.addHandler(fh)
logger3.addHandler(ch)

#logger4.addFilter(filter)  
logger4.addHandler(fh)
logger4.addHandler(ch)

logger5.addHandler(fh)
logger5.addHandler(ch)

# 記錄一條日誌    
logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')

logger1.debug('logger1 debug message')
logger1.info('logger1 info message')
logger1.warning('logger1 warning message')
logger1.error('logger1 error message')
logger1.critical('logger1 critical message')

logger2.debug('logger2 debug message')
logger2.info('logger2 info message')
logger2.warning('logger2 warning message')
logger2.error('logger2 error message')
logger2.critical('logger2 critical message')

logger3.debug('logger3 debug message')
logger3.info('logger3 info message')
logger3.warning('logger3 warning message')
logger3.error('logger3 error message')
logger3.critical('logger3 critical message')

logger4.debug('logger4 debug message')
logger4.info('logger4 info message')
logger4.warning('logger4 warning message')
logger4.error('logger4 error message')
logger4.critical('logger4 critical message')

logger5.debug('logger5 debug message')
logger5.info('logger5 info message')
logger5.warning('logger5 warning message')
logger5.error('logger5 error message')
logger5.critical('logger5 critical message')


3.執行命令模塊

可以執行shell命令的相關模塊和函數有:

  • os.system

  • os.spawn*

  • os.popen*          --廢棄

  • popen2.*           --廢棄

  • commands.*      --廢棄,3.x中被移除

以上執行shell命令的相關的模塊和函數的功能均在 subprocess 模塊中實現,並提供了更豐富的功能。

例:

call

執行命令,返回狀態碼

ret = subprocess.call(["ls", "-l"], shell=False) #shell爲False時使用python的接口執行命令,傳遞命令參數只能通過列表。

ret = subprocess.call("ls -l", shell=True) #shell爲True時使用默認shell執行,傳遞命令參數採用字符串拼接的方式,要用引號傳遞命令。

check_call

執行命令,如果執行狀態碼是 0 ,則返回0,否則拋異常。

subprocess.check_call(["ls", "-l"])
subprocess.check_call("exit 1", shell=True)

check_output

執行命令,如果狀態碼是 0 ,則返回執行結果,否則拋異常

subprocess.check_output(["echo", "Hello World!"])
subprocess.check_output("exit 1", shell=True)

subprocess.Popen(...)

用於執行復雜的系統命令

參數:

  • args:shell命令,可以是字符串或者序列類型(如:list,元組)

  • bufsize:指定緩衝。0 無緩衝,1 行緩衝,其他 緩衝區大小,負值 系統緩衝

  • stdin, stdout, stderr:分別表示程序的標準輸入、輸出、錯誤句柄

  • preexec_fn:只在Unix平臺下有效,用於指定一個可執行對象(callable object),它將在子進程運行之前被調用

  • close_sfs:在windows平臺下,如果close_fds被設置爲True,則新創建的子進程將不會繼承父進程的輸入、輸出、錯誤管道。
    所以不能將close_fds設置爲True同時重定向子進程的標準輸入、輸出與錯誤(stdin, stdout, stderr)。

  • shell:同上

  • cwd:用於設置子進程的當前目錄

  • env:用於指定子進程的環境變量。如果env = None,子進程的環境變量將從父進程中繼承。

  • universal_newlines:不同系統的換行符不同,True -> 同意使用 \n

  • startupinfo與createionflags只在windows下有效

    將被傳遞給底層的CreateProcess()函數,用於設置子進程的一些屬性,如:主窗口的外觀,進程的優先級等等

管道

import subprocess

obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
obj.stdin.write('print 1 \n')
obj.stdin.write('print 2 \n')
obj.stdin.write('print 3 \n')
obj.stdin.write('print 4 \n')

out_error_list = obj.communicate()
print out_error_list





3.正則

re模塊用於對python的正則表達式的操作。

字符:

  . 匹配除換行符以外的任意字符
  \w 匹配字母或數字或下劃線或漢字
  \s 匹配任意的空白符
  \d 匹配數字
  \b 匹配單詞的開始或結束
  ^ 匹配字符串的開始
  $ 匹配字符串的結束

次數:

  * 重複零次或更多次
  + 重複一次或更多次
  ? 重複零次或一次
  {n} 重複n次
  {n,} 重複n次或更多次
  {n,m} 重複n到m次

    | 或

    []包含

    [^]不包含


# r“\n" ==>  \\n

1、match(pattern, string, flags=0)

從起始位置開始根據模型去字符串中匹配指定內容,匹配單個

  • 正則表達式

  • 要匹配的字符串

  • 標誌位,用於控制正則表達式的匹配方式

import re

obj = re.match('\d+', '123uuasf')
if obj:
    print obj.group()
    
    
    
# flagsI = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE 
# ignore caseL = LOCALE = sre_compile.SRE_FLAG_LOCALE 
# assume current 8-bit localeU = UNICODE = sre_compile.SRE_FLAG_UNICODE 
# assume unicode localeM = MULTILINE = sre_compile.SRE_FLAG_MULTILINE 
# make anchors look for newlineS = DOTALL = sre_compile.SRE_FLAG_DOTALL 
# make dot match newlineX = VERBOSE = sre_compile.SRE_FLAG_VERBOSE 
# ignore whitespace and comments


2、search(pattern, string, flags=0)

根據模型去字符串中匹配指定內容,匹配單個

import re

obj = re.search('\d+', 'u123uu888asf')
if obj:
    print obj.group()


3、group和groups

a = "123abc456"
print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group()
print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(0)
print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(1)
print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(2)
print re.search("([0-9]*)([a-z]*)([0-9]*)", a).groups()


4、findall(pattern, string, flags=0)

上述兩中方式均用於匹配單值,即:只能匹配字符串中的一個,如果想要匹配到字符串中所有符合條件的元素,則需要使用 findall。

import re

obj = re.findall('\d+', 'fa123uu888asf')
print obj


5、sub(pattern, repl, string, count=0, flags=0)

用於替換匹配的字符串

content = "123abc456"
new_content = re.sub('\d+', 'sb', content)
# new_content = re.sub('\d+', 'sb', content, 1)
print new_content

相比於str.replace功能更加強大 #有些複雜的脫意需用replace處理。



6、split(pattern, string, maxsplit=0, flags=0)

根據指定匹配進行分組

content = "'1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )'"
new_content = re.split('\*', content)
# new_content = re.split('\*', content, 1)print new_content


content = "'1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )'"
new_content = re.split('[\+\-\*\/]+', content)
# new_content = re.split('\*', content, 1)print new_content


inpp = '1-2*((60-30 +(-40-5)*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))'
inpp = re.sub('\s*','',inpp)
new_content = re.split('\(([\+\-\*\/]?\d+[\+\-\*\/]?\d+){1}\)', inpp, 1)print new_content



4.時間模塊


time

時間相關的操作,時間有三種表示方式:

  • 時間戳               1970年1月1日之後的秒,即:time.time()

  • 格式化的字符串    2014-11-11 11:11,    即:time.strftime('%Y-%m-%d')

  • 結構化時間          元組包含了:年、日、星期等... time.struct_time    即:time.localtime()

print time.time()
print time.mktime(time.localtime())  #轉換結構化時間爲時間戳。
  
print time.gmtime()    #可加時間戳參數
print time.localtime() #可加時間戳參數
print time.strptime('2014-11-11', '%Y-%m-%d') #結構化時間
  
print time.strftime('%Y-%m-%d') #默認當前時間
print time.strftime('%Y-%m-%d',time.localtime()) #默認當前時間
print time.asctime()
print time.asctime(time.localtime()) #使結構化時間元組格式化輸出 
例: 'Wed Nov 18 11:55:08 2015'
print time.ctime(time.time()) #使時間戳格式化輸出
例: 'Wed Nov 18 11:55:08 2015'
  
import datetime
'''
datetime.date:表示日期的類。常用的屬性有year, month, day
datetime.time:表示時間的類。常用的屬性有hour, minute, second, microsecond
datetime.datetime:表示日期時間
datetime.timedelta:表示時間間隔,即兩個時間點之間的長度
timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
strftime("%Y-%m-%d") #時間差。
'''
import datetime

print datetime.datetime.now()
例:datetime.datetime(2015, 11, 18, 12, 2, 37, 103881)
print datetime.datetime.now() - datetime.timedelta(days=5)


時間格式轉換圖例:

182222117511121.png



5.文件操作模塊。

shutil

高級的 文件、文件夾、壓縮包 處理模塊

shutil.copyfileobj(文件句柄fsrc, 文件句柄fdst[, length])
將文件內容拷貝到另一個文件中,可以部分內容

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

shutil.make_archive(base_name, format,...)

創建壓縮包並返回文件路徑,例如:zip#zip壓縮不包含空目錄、tar

  • base_name: 壓縮包的文件名,也可以是壓縮包的路徑。只是文件名時,則保存至當前目錄,否則保存至指定路徑,
    如:www                        =>保存至當前路徑
    如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/

  • format: 壓縮包種類,“zip”, “tar”, “bztar”,“gztar”

  • root_dir: 要壓縮的文件夾路徑(默認當前目錄)

  • owner: 用戶,默認當前用戶

  • group: 組,默認當前組

  • logger: 用於記錄日誌,通常是logging.Logger對象


#將 /Users/wupeiqi/Downloads/test 下的文件打包放置當前程序目錄
import shutil
ret = shutil.make_archive("wwwwwwwwww"'gztar', root_dir='/Users/wupeiqi/Downloads/test')
#將 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目錄
import shutil
ret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww"'gztar', root_dir='/Users/wupeiqi/Downloads/test')

shutil 對壓縮包的處理是調用 ZipFile 和 TarFile 兩個模塊來進行的,詳細:

import zipfile# 壓縮z = zipfile.ZipFile('laxi.zip', 'w')
z.write('a.log')
z.write('data.data')
z.close()# 解壓z = zipfile.ZipFile('laxi.zip', 'r')
z.extractall()
z.close()

import tarfile

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

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

tarfile 壓縮解壓




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章