文章目錄
組織文件
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的級別的內容也可以顯示在控制檯上了")