IT书籍读书笔记|《Python编程快速上手,让繁琐工作自动化》读书笔记


文章目录

  • 组织文件
    • shutil模块
      • 复制文件和文件夹
      • 文件和文件夹的移动与改名
      • 删除文件和文件夹
        • os.unlink(filename)删除文件
        • os.rmdir(foldname)删除空目录
        • shutil.rmtree(foldname)删除文件夹
        • send2trash模块把文件放入回收站中
    • 遍历目录树
  • 发送电子邮件
  • 处理屏幕
    • 控制鼠标
      • 移动鼠标并按下鼠标
      • 获取鼠标坐标位置
      • 获取鼠标坐标位置以前当前像素掉的RGB值
    • 获取屏幕快照
    • 分析屏幕快照
    • 图像识别
  • 日志
    • 使用日志模块
    • 不要用printf()调试
    • 日志级别
    • 禁用日志
    • 将日志记录到文件
  • 参考链接

组织文件 shutil模块 复制文件和文件夹
# -*- coding: utf-8 -*- import os import shutilif __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 shutilif __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 shutilif __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 shutilif __name__ == "__main__": # os.chdir("d://3") os.rmdir("d://2") # 当目录不为空的时候不能删除print("end.")

shutil.rmtree(foldname)删除文件夹
# -*- coding: utf-8 -*- import os import shutilif __name__ == "__main__": # os.chdir("d://3") shutil.rmtree("d://2") # 直接删除整个目录及其下面的子文件夹print("end.")

send2trash模块把文件放入回收站中 上面三个函数都是直接永久删除文件夹,这个函数则是放到回收站中
# -*- coding: utf-8 -*- import os import send2trashif __name__ == "__main__": os.chdir("d://1") for filename in os.listdir(): send2trash.send2trash(filename) # 只能是挨个放入回收站print("end.")

遍历目录树 假如希望对某个文件夹中的所有文件进行操作,包括该文件夹中所有子文件夹中的所有文件。那么可以使用os.walk函数
# -*- coding: utf-8 -*- import os import send2trashif __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.")

输出如下图:
IT书籍读书笔记|《Python编程快速上手,让繁琐工作自动化》读书笔记
文章图片

发送电子邮件 使用163邮箱发送,设置和代码请参考:python使用163邮箱发送邮件
使用qq邮箱发送,设置和代码请参考:Python3 SMTP发送邮件
处理屏幕 控制鼠标 移动鼠标并按下鼠标
使用模块下的move函数完成该功能
# -*- coding: utf-8 -*-import pyautoguiif __name__ == "__main__": # duration指定了将鼠标移动到目标位置所需的秒数 pyautogui.moveTo(1000, 1000, duration=0.25) pyautogui.click() # 完成点击事件,配合Windows画图工具可以看成所按下的点print("end.")

获取鼠标坐标位置
# -*- coding: utf-8 -*-import pyautoguiif __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 pyautoguiif __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 pyautoguiif __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 pyautoguiif __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.")

输出如下信息
IT书籍读书笔记|《Python编程快速上手,让繁琐工作自动化》读书笔记
文章图片

图像识别 【IT书籍读书笔记|《Python编程快速上手,让繁琐工作自动化》读书笔记】如果实现不知道点击哪里,则可以使用图像识别来帮助判断,但此方法局限就在于,如果出现一个像素的偏差,那么该函数也会返回None
# -*- coding: utf-8 -*-import pyautoguiif __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 totalif __name__ == "__main__": factorial(5) logging.debug('End of program')

输出如下
IT书籍读书笔记|《Python编程快速上手,让繁琐工作自动化》读书笔记
文章图片

不要用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的级别的内容也可以显示在控制台上了")

参考链接
  • python中logging日志模块详解
  • python logging模块

    推荐阅读