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

参考链接

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值