python培訓Day6 隨筆

今天講了一些python的實用地方工具模塊


loggin模塊

用於記錄日誌

#!/usr/bin/env python
#--*--coding:utf-8--*--
import logging
logging.basicConfig(filename='wgwtest.log', #filename代表記錄的日誌文件名稱
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                    #日誌格式參數 包括修改時間 啓動程序的用戶名 日誌告警級別 日誌記錄的程序名稱 告警信息
                    datefmt='%Y-%m-%d %H:%M:%S %p',
                    #日誌中asctime的時間格式
                    level=logging.DEBUG)
                    #設置日誌等級,設置之後只打印這個等級和這個等級以上的告警
                    #默認的等級是logging.warning
#告警之後寫入的告警信息%(message)s的內容
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')

打印出來的日誌內容爲

2015-12-04 16:21:15 PM - root - DEBUG -wgwtest:  debug
2015-12-04 16:21:15 PM - root - INFO -wgwtest:  info
2015-12-04 16:21:15 PM - root - WARNING -wgwtest:  warning
2015-12-04 16:21:15 PM - root - ERROR -wgwtest:  error
2015-12-04 16:21:15 PM - root - CRITICAL -wgwtest:  critical

在日誌格式的參數方面,還有很多的可以用來設置的

%(levelno)s: 打印日誌級別的數值

%(levelname)s: 打印日誌級別名稱

%(pathname)s: 打印當前執行程序的路徑,其實就是sys.argv[0]

%(filename)s: 打印當前執行程序名

%(funcName)s: 打印日誌的當前函數

%(lineno)d: 打印日誌的當前行號

%(asctime)s: 打印日誌的時間

%(thread)d: 打印線程ID

%(threadName)s: 打印線程名稱

%(process)d: 打印進程ID

%(message)s: 打印日誌信息

日誌的打印等級由高到低

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


time模塊

import time
print time.strftime('%Y-%m-%d',time.localtime()) #格式化實現本地當前時間
2015-12-04 18:21:18
import time
print time.asctime(time.localtime())  #以文字形式顯示的日期
Fri Dec 04 18:33:10 2015


datetime模塊

import datetime
print datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') #獲取當前時間
2015-12-04 18:37:42
import datetime
print datetime.datetime.now() - datetime.timedelta(days=5) #獲取5天前的日期
2015-11-29 18:44:33.063000
import datetime
print datetime.datetime.now() + datetime.timedelta(minutes=30) #獲取30分鐘後的時間
2015-12-04 19:18:35.263000


shutil模塊

用於對文件,文件夾的高級操作,可以複製文件或者文件夾並且壓縮文件夾

shutil.copy()

複製一個目標文件的內容和權限,如果文件不存在就創建一個文件,如果存在就覆蓋裏面的內容

import shutil
shutil.copy('test','test2')


shutil.copytree()

遞歸的複製文件,其實就是複製文件夾。可以將文件夾裏的所有內容複製到另一個文件夾

import shutil
shutil.copytree('testdir','bak_testdir')
[wgw@mail ~]$ ls -l |grep testdir
drwxrwxr-x  2 wgw   wgw        4096 Dec  4 20:59 bak_testdir
drwxrwxr-x  2 wgw   wgw        4096 Dec  4 20:59 testdir

shutil.rmtree()

遞歸的刪除文件,其實就是刪除一個文件夾和文件夾裏的文件

import shutil
shutil.rmtree('testdir')
[wgw@mail ~]$ ls -l |grep testdir
drwxrwxr-x  2 wgw   wgw        4096 Dec  4 20:59 bak_testdir

shutil.move()

遞歸的移動文件,其實就是移動文件夾

import shutil
shutil.move('bak_testdir','new_testdir')
[wgw@mail ~]$ ls -l |grep testdir
drwxrwxr-x  2 wgw   wgw        4096 Dec  4 20:59 new_testdir

該命令也可以用於移動單個文件

shutil.move('logger.pyc','1.pyc')


shutil模塊還有壓縮文件夾的功能

make_archive(base_name, format, root_dir=None)
這個功能有三個基本參數,base_name表示打包之後的文件名,format表示打包的格式(“zip”, “tar”, “bztar”,“gztar”),root_dir表示要被打包的目錄路徑(默認是本地)
import shutil
shutil.make_archive('wgw','gztar','/home/wgw')
[wgw@mail ~]$ ls -l |grep wgw.tar.gz
-rw-rw-r--  1 wgw   wgw         138 Dec  4 21:32 wgw.tar.gz


subprocess模塊

該模塊的作用是執行系統命令,並且把系統命令的結果返回,也可以返回運行結果的代碼

import subprocess
obj=subprocess.Popen(['df','-h'],shell=False,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print obj.wait()
print obj.stderr.read()
print obj.stdout.read()

默認情況下,shell=False此時要運行的命令需要一個個輸入到列表中。  當shell=True就表示要調用系統的shell來運行命令了。cwd參數表示要執行命令的路徑

obj=subprocess.Popen('df -h',shell=True,cwd='/home/wgw')


stdin, stdout, stderr:分別表示程序的標準輸入、輸出、錯誤句柄,通過subprocess.PIPE的管道傳輸出來,並通過obj.stdout.read()將結果讀取出來。當命令的執行結果正確的時候obj.wait()的值爲0,當執行結果不爭取的時候值爲1



面向對象的編程

所謂類就是同一種事物共通屬性的集合。函數寫在類下面就改名叫類裏面的方法了。但是函數的定義方法還是一樣的。

class person():
    #定義這個類可以傳入的參數,self是默認必須有的
    def __init__(self,name,age):
        '''把類外面的參數值傳入類裏面,這樣類裏的方法要用
        外面傳入的參數的時候直接只用self.xxx就可以使用這些值了
        '''
        self.name=name
        self.age=age
    #在類裏面函數就改名叫做方法了,但是和函數一樣也可以爲方法自己單獨定義參數
    def take_money(self,money):
        return '%s take $%d'%(self.name,money)
    #定義一個無參數的方法
    def sayhi(self):
        return 'my name is %s age is %d'%(self.name,self.age)
#將類實例化
user1=person('wgw',32)
user2=person('haha',35)
#打印調用類裏面的方法之後的結果
print user1.take_money(3000)
print user1.sayhi()
print '#'*20
print user2.take_money(6000)
print user2.sayhi()
wgw take $3000
my name is wgw age is 32
####################
haha take $6000
my name is haha age is 35



我個人的理解,所謂的類就是一個大的模板,類裏面的方法就是這個模板包含的功能。但是這個模板建立好了之後並不運行。只有模板被調用了也就是實例化了這個模板才變成真正的功能模塊,提供相應的功能。

舉個現實的例子就是,我們需要軟件打字。那麼office就是集成了打字功能的類。這裏類裏面打字的方法有word,有excel還有ppt都可以實現打字功能。但是這三個方法又不完全一樣。現在的office只是個名稱而已,是抽象的。我們不能光靠說office軟件名稱電腦就自己把字打出來了。我們需要把office裝到個人的電腦上才能讓自己打字。軟件裝在電腦上這個步驟就是把office具體的實例化了,變成user1電腦上的office了。把這個人的屬性加到office就叫實例化。

office類裏面包含了word、ppt、excel三個方法呢。user1和user2兩個用戶分別實例化之後就可以調用各自電腦上的word方法進行打字了。也可以分別調用不同的方法打字。以後user3、user4再有打字需求都可以調用office類來解決,這樣既可以實現代碼的複用又可以調用不同的方法滿足靈活性的需求。有更新需求了只需要調整類裏面的代碼就可以了。office安裝在誰的電腦上這個參數必須在def __init__()類的初始化部分聲明參數,並且通過self.name=name 這個方法將用戶名這種參數導入到類的內部。這樣調用word等方法的時候通過self.name就纔可以知道打字能跑在誰的電腦上。


類和函數最大的區別就是,類是抽象的不實例化沒意義,只有裏面方法纔是處理問題的。但函數是寫出來代碼裏就具體包含了要實現的功能。


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