《Python編程快速上手,讓繁瑣工作自動化》讀書筆記

組織文件

shutil模塊

複製文件和文件夾

# -*- coding: utf-8 -*-
import os
import shutil

if __name__ == "__main__":
    os.chdir("d://")
    shutil.copy("d://spam.txt", "d://1") # # 複製d://spam.txt到d://1文件夾下
    shutil.copy("d://spam.txt", "d://1//1.txt") # 複製d://spam.txt到d://1文件夾下,並重命名爲1.txt
    shutil.copytree("d://1", "d://2") # 將整個文件夾從d://1複製爲d://2
    print("end.")

文件和文件夾的移動與改名

# -*- coding: utf-8 -*-
import os
import shutil

if __name__ == "__main__":
    os.chdir("d://")
    shutil.move("d://spam.txt", "d://3") # 將d://spam.txt移動到d://3文件夾中,需要保證3文件夾存在
    shutil.move("d://spam.txt", "d://3//3.txt") # 將d://spam.txt移動到d://3文件夾中並重命名爲3.txt,需要保證3文件夾存在
    
    print("end.")

刪除文件和文件夾

利用os模塊中的函數,可以刪除一個文件或一個空文件夾。但利用shutil模塊,可以刪除一個文件夾及其所有的內容

os.unlink(filename)刪除文件

# -*- coding: utf-8 -*-
import os
import shutil

if __name__ == "__main__":
    os.chdir("d://3")
    for filename in os.listdir():
        print(filename)
        os.unlink(filename) # 直接永久刪除這些文件
    
    print("end.")

os.rmdir(foldname)刪除空目錄

# -*- coding: utf-8 -*-
import os
import shutil

if __name__ == "__main__":
    # os.chdir("d://3")
    os.rmdir("d://2") # 當目錄不爲空的時候不能刪除
    
    print("end.")

shutil.rmtree(foldname)刪除文件夾

# -*- coding: utf-8 -*-
import os
import shutil

if __name__ == "__main__":
    # os.chdir("d://3")
    shutil.rmtree("d://2") # 直接刪除整個目錄及其下面的子文件夾
    
    print("end.")

send2trash模塊把文件放入回收站中

上面三個函數都是直接永久刪除文件夾,這個函數則是放到回收站中

# -*- coding: utf-8 -*-
import os
import send2trash

if __name__ == "__main__":
    os.chdir("d://1")
    for filename in os.listdir():
        send2trash.send2trash(filename) # 只能是挨個放入回收站
    
    print("end.")

遍歷目錄樹

假如希望對某個文件夾中的所有文件進行操作,包括該文件夾中所有子文件夾中的所有文件。那麼可以使用os.walk函數

# -*- coding: utf-8 -*-
import os
import send2trash

if __name__ == "__main__":
    os.walk("d://1")
    for folderName, subfolders, filenames in os.walk("d://1"):
        print("The current folder is " + folderName)
        for subfolder in subfolders:
            print("Subfolder of " + folderName + ": " + subfolder)
        for filename in filenames:
            print("file inside " + folderName + ": " + filename)
    
    print("end.")

輸出如下圖:

在這裏插入圖片描述

發送電子郵件

使用163郵箱發送,設置和代碼請參考:python使用163郵箱發送郵件

使用qq郵箱發送,設置和代碼請參考:Python3 SMTP發送郵件

處理屏幕

控制鼠標

移動鼠標並按下鼠標

使用模塊下的move函數完成該功能

# -*- coding: utf-8 -*-

import pyautogui

if __name__ == "__main__":
    # duration指定了將鼠標移動到目標位置所需的秒數
    pyautogui.moveTo(1000, 1000, duration=0.25)
    pyautogui.click() # 完成點擊事件,配合Windows畫圖工具可以看成所按下的點
    
    print("end.")

獲取鼠標座標位置

# -*- coding: utf-8 -*-

import pyautogui

if __name__ == "__main__":
    print('Press Ctrl-C to quit.')
    try:
        while True:
            # Get and print the mouse coordinates.
            x, y = pyautogui.position()
            positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4)
            print(positionStr, end='')
            print('\b' * len(positionStr), end='', flush=True)

    except KeyboardInterrupt:
        print('\nDone.')
    
    print("end.")

獲取鼠標座標位置以前當前像素掉的RGB值

# -*- coding: utf-8 -*-

import pyautogui

if __name__ == "__main__":
    print('Press Ctrl-C to quit.')
    try:
        while True:
            # Get and print the mouse coordinates.
            x, y = pyautogui.position()
            positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4)
            pixelColor = pyautogui.screenshot().getpixel((x, y))
            positionStr += ' RGB: (' + str(pixelColor[0]).rjust(3)
            positionStr += ', ' + str(pixelColor[1]).rjust(3)
            positionStr += ', ' + str(pixelColor[2]).rjust(3) + ')'
            print(positionStr, end=##'')
            print('\b' * len(positionStr), end='', flush=True)

    except KeyboardInterrupt:
        print('\nDone.')
    
    print("end.")

獲取屏幕快照

# -*- coding: utf-8 -*-

import pyautogui

if __name__ == "__main__":
    im1 = pyautogui.screenshot() # 截圖後保存到內存中
    im2 = pyautogui.screenshot("output.png") # 截圖後保存到文件中
    im3 = pyautogui.screenshot("output2.png", region=(0, 0, 300, 400)) # 只截圖區域

    # 得到某個點的像素值
    print(im1.getpixel((0, 0)))
    print(im1.getpixel((50, 200)))
    
    print("end.")

分析屏幕快照

通過分析屏幕快照,可以知道當前所點擊的位置是否是同一個,比如被彈出的廣告擋住了,那麼再繼續點擊是無效的

# -*- coding: utf-8 -*-

import pyautogui

if __name__ == "__main__":
    im1 = pyautogui.screenshot() # 截圖後保存到內存中
    # 得到某個點的像素值
    print(im1.getpixel((50, 200))) # 事先知道當前的顏色爲(51, 51, 51)
    if pyautogui.pixelMatchesColor(50, 200, ((51, 51, 51))):
        print("True.")
    else:
        print("False")
    
    print("end.")

輸出如下信息

在這裏插入圖片描述

圖像識別

如果實現不知道點擊哪裏,則可以使用圖像識別來幫助判斷,但此方法侷限就在於,如果出現一個像素的偏差,那麼該函數也會返回None

# -*- coding: utf-8 -*-

import pyautogui

if __name__ == "__main__":
    if pyautogui.locateAllOnScreen("screenshot.png"):
        print("True.")
    else:
        print("False.")
    
    print("end.")

示例代碼中的screenshot.png爲我截取屏幕的一小塊區域

日誌

使用日誌模塊

# -*- coding: utf-8 -*-

import logging
# basicConfig用來設置日誌的信息,最好把此行代碼放在最上面,方便以後做統一修改
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

if __name__ == "__main__":
    logging.debug("Start of program.")

使用logging來輸出factorial的中間信息

# -*- coding: utf-8 -*-

import logging
# basicConfig用來設置日誌的信息,最好把此行代碼放在最上面,方便以後做統一修改
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

def factorial(n):
    logging.debug('Start of factorial(%s%%)' % (n))
    total = 1
    for i in range(1, n + 1):
        total *= i
        logging.debug('i is ' + str(i) + ', total is ' + str(total))
    logging.debug('End of factorial(%s%%)' % (n))
    return total

if __name__ == "__main__":
    factorial(5)
    logging.debug('End of program')

輸出如下

在這裏插入圖片描述

不要用printf()調試

使用printf進行輸出,在調試完成後,需要花很多時間,從代碼中清楚每條printf調用

日誌消息是給程序員看的,不是給用戶的。用戶不會因爲你便於調試,而想看到的字典值的內容。請將日誌信息用於類似這樣的目的。對於用戶希望看到的消息,例如“文件未找到”或者“請輸入一個數字”,才應該使用printf

日誌級別

  • debug : 打印全部的日誌,詳細的信息,通常只出現在診斷問題上
  • info : 打印info,warning,error,critical級別的日誌,確認一切按預期運行
  • warning : 打印warning,error,critical級別的日誌,一個跡象表明,一些意想不到的事情發生了,或表明一些問題在不久的將來(例如。磁盤空間低”),這個軟件還能按預期工作
  • error : 打印error,critical級別的日誌,更嚴重的問題,軟件沒能執行一些功能
  • critical : 打印critical級別,一個嚴重的錯誤,這表明程序本身可能無法繼續運行

這時候,如果需要顯示低於WARNING級別的內容,可以引入NOTSET級別來顯示:

import logging  # 引入logging模塊
logging.basicConfig(level=logging.NOTSET, format='%(asctime)s - %(levelname)s - %(message)s')  # 設置日誌級別
logging.debug(u"如果設置了日誌級別爲NOTSET,那麼這裏可以採取debug、info的級別的內容也可以顯示在控制檯上了")

當設定的級別是INFO,則不會顯示出debug的日誌

# -*- coding: utf-8 -*-

import logging
# basicConfig用來設置日誌的信息,最好把此行代碼放在最上面,方便以後做統一修改
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')  # 設置日誌級別

if __name__ == "__main__":
    logging.debug(u"如果設置了日誌級別爲NOTSET,那麼這裏可以採取debug、info的級別的內容也可以顯示在控制檯上了")

禁用日誌

在調試完成後,如果不希望這些日誌出現在屏幕上。可以使用disable進行用着消息

# -*- coding: utf-8 -*-

import logging
# basicConfig用來設置日誌的信息,最好把此行代碼放在最上面,方便以後做統一修改
logging.basicConfig(level=logging.NOTSET, format='%(asctime)s - %(levelname)s - %(message)s')  # 設置日誌級別

if __name__ == "__main__":
    logging.disable(logging.DEBUG)
    logging.debug(u"如果設置了日誌級別爲NOTSET,那麼這裏可以採取debug、info的級別的內容也可以顯示在控制檯上了")

將日誌記錄到文件

除了將日誌消息顯示在屏幕上,還可以將他們寫入文本文件

# -*- coding: utf-8 -*-

import logging
# basicConfig用來設置日誌的信息,最好把此行代碼放在最上面,方便以後做統一修改
logging.basicConfig(filename="log.txt", level=logging.NOTSET, format='%(asctime)s - %(levelname)s - %(message)s')  # 設置日誌級別

if __name__ == "__main__":
    logging.debug(u"如果設置了日誌級別爲NOTSET,那麼這裏可以採取debug、info的級別的內容也可以顯示在控制檯上了")

參考鏈接

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