文章目录
- 组织文件
-
- 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.")
输出如下图:
发送电子邮件 使用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编程快速上手,让繁琐工作自动化》读书笔记】如果实现不知道点击哪里,则可以使用图像识别来帮助判断,但此方法局限就在于,如果出现一个像素的偏差,那么该函数也会返回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')
输出如下
不要用printf()调试 使用printf进行输出,在调试完成后,需要花很多时间,从代码中清楚每条printf调用
文章图片
日志消息是给程序员看的,不是给用户的。用户不会因为你便于调试,而想看到的字典值的内容。请将日志信息用于类似这样的目的。对于用户希望看到的消息,例如“文件未找到”或者“请输入一个数字”,才应该使用printf
日志级别
- debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上
- info : 打印info,warning,error,critical级别的日志,确认一切按预期运行
- warning : 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作
- error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能
- critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行
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模块