哪些工作值得写成自动化脚本
不是所有工作都值得自动化。判断标准很简单:这件事你会不会做第二次。如果只是一次性操作,手动做更快;如果你每周都要整理一次报表、每天都要批量重命名文件、每个月都要发几十封邮件——这些就是自动化的目标。
Python 做办公自动化的优势是库多:读写 Excel 用 openpyxl、发邮件用 smtplib、操作文件用标准库 pathlib、定时任务用 schedule 或系统任务计划程序。你不需要学复杂的框架,几十行代码就能解决一个具体问题。
自动化的价值不是写代码本身,而是把你从重复劳动中解放出来去做更有价值的事。
- pathlibPython 3.4+ 内置的路径操作库,比 os.path 更直观。
- openpyxl读写 Excel .xlsx 文件的标准库。
- smtplib发送邮件的标准库,配合 email 模块发带附件的邮件。
- schedule轻量级定时任务库,几行代码搞定周期性执行。
文件批量处理:重命名与整理
最常见的自动化需求是文件整理。比如下载文件夹里有几百张照片,文件名是相机自动生成的 IMG_0001.jpg,你想统一改成 20261014_旅行_001.jpg 这样有意义的名字。
from pathlib import Path
folder = Path("D:/照片/旅行")
files = sorted(folder.glob("IMG_*.jpg"))
for i, f in enumerate(files, start=1):
new_name = f"20261014_旅行_{i:03d}.jpg"
f.rename(folder / new_name)
print(f"{f.name} -> {new_name}")
Path.glob("IMG_*.jpg") 用通配符匹配所有 IMG 开头的 jpg 文件,enumerate 从 1 开始编号,{i:03d} 把数字格式化成三位数(001、002)。运行前先打印出来确认,确认无误再执行重命名。
另一个高频场景是按扩展名分类整理:把文件夹里的图片、文档、压缩包分别移到对应子目录。
from pathlib import Path
import shutil
folder = Path("D:/下载")
rules = {
"图片": [".jpg", ".png", ".gif"],
"文档": [".doc", ".docx", ".pdf", ".txt"],
"压缩包": [".zip", ".rar", ".7z"],
}
for f in folder.iterdir():
if f.is_file():
for sub, exts in rules.items():
if f.suffix.lower() in exts:
target = folder / sub
target.mkdir(exist_ok=True)
shutil.move(str(f), str(target / f.name))
break
Excel 自动化:用 openpyxl 读写表格
办公里最花时间的就是 Excel。手动复制粘贴、合并多个表、按条件筛选——这些全部可以用 Python 脚本自动完成。安装 openpyxl:pip install openpyxl。
from openpyxl import load_workbook
wb = load_workbook("销售数据.xlsx")
ws = wb.active
# 读第一行(表头)
headers = [cell.value for cell in ws[1]]
print(headers)
# 遍历数据行
for row in ws.iter_rows(min_row=2, values_only=True):
product, price, qty = row
total = price * qty
print(f"{product}: {total} 元")
# 写入新列:合计
ws.cell(row=1, column=4, value="合计")
for r in range(2, ws.max_row + 1):
price = ws.cell(row=r, column=2).value
qty = ws.cell(row=r, column=3).value
ws.cell(row=r, column=4, value=price * qty)
wb.save("销售数据_已处理.xlsx")
这段代码做了四件事:打开工作簿、读表头、逐行计算合计、写入新列并保存。iter_rows(min_row=2) 从第二行开始读(跳过表头),values_only=True 只取单元格值不取样式。
合并多个 Excel 文件也是常用场景:把一个文件夹里所有月度报表合并成一个总表。
批量发邮件:smtplib 实战
每月给客户发对账单、每周给团队发周报——这些重复性邮件用脚本发最省事。Python 标准库 smtplib 直接可用,不需要额外安装。
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
# 邮件内容
msg = MIMEMultipart()
msg["From"] = "your@company.com"
msg["To"] = "client@example.com"
msg["Subject"] = Header("10 月对账单", "utf-8")
body = "您好,附件为 10 月对账单,请查收。"
msg.attach(MIMEText(body, "plain", "utf-8"))
# 添加附件
with open("10月对账单.xlsx", "rb") as f:
attachment = MIMEText(f.read(), "base64", "utf-8")
attachment["Content-Disposition"] = 'attachment; filename="10月对账单.xlsx"'
msg.attach(attachment)
# 发送
with smtplib.SMTP_SSL("smtp.qq.com", 465) as server:
server.login("your@company.com", "授权码")
server.sendmail("your@company.com", "client@example.com", msg.as_string())
关键点:邮箱需要开启 SMTP 服务并生成授权码(不是登录密码)。QQ 邮箱在设置里开启 SMTP 后会给一个授权码,用它代替密码登录。要发给多人时,把收件人列表放进去循环发送即可。
定时任务:让脚本自己跑起来
脚本写好了,每次手动运行还是麻烦。用 schedule 库可以让脚本定时自动执行:pip install schedule。
import schedule
import time
from datetime import datetime
def job():
print(f"[{datetime.now()}] 开始整理下载文件夹")
# 调用前面的文件整理逻辑
print("完成")
# 每天早上 9 点执行
schedule.every().day.at("09:00").do(job)
# 每小时执行一次
schedule.every().hour.do(job)
# 保持脚本运行
while True:
schedule.run_pending()
time.sleep(60)
这种方式适合脚本长期运行在一台电脑或服务器上。如果不想一直挂着 Python 进程,Windows 上可以用任务计划程序(Task Scheduler),Linux 上用 crontab,直接指定脚本在指定时间运行。
| 场景 | 推荐方式 |
|---|---|
| 每天固定时间跑一次 | Windows 任务计划 / Linux crontab |
| 需要分钟级间隔、长期驻留 | Python schedule 库 |
| 服务器上后台运行 | nohup 或 systemd 服务 |
脚本打包:给同事一个 exe
同事没有 Python 环境怎么办?用 PyInstaller 把脚本打包成 exe 文件,双击就能运行。pip install pyinstaller。
# 打包成单个 exe(不含控制台窗口)
pyinstaller --onefile --windowed --name "文件整理工具" organize.py
# 带图标
pyinstaller --onefile --icon=app.ico --name "文件整理工具" organize.py
--onefile 把所有依赖打包成一个 exe,--windowed 运行时不弹出黑色控制台窗口(适合 GUI 工具)。打包后的 exe 在 dist/ 目录下,发给同事直接双击使用,不需要装 Python。
如果脚本有 GUI 界面,搭配 tkinter(Python 内置)或 PyQt,做一个简单的文件选择窗口加运行按钮,就是一个完整的小工具。
自动化脚本的工程化建议
写自动化脚本和写业务系统不一样——它通常是你一个人用的工具,不需要复杂的架构,但有几个实践能让脚本更好维护:
- 先备份再操作:涉及文件移动、删除、覆盖的操作,先复制一份到备份目录,脚本出错也能恢复。
- 打印日志:每一步操作都 print 出来,出问题时知道卡在哪一步。重要脚本可以写日志到文件。
- 异常处理:用 try-except 包住关键步骤,单个文件出错不要中断整个批量任务,记录下来继续处理下一个。
- 路径用 pathlib:不要手写斜杠拼接路径,pathlib 在 Windows 和 Linux 上都能正确处理路径分隔符。
自动化脚本的终极目标是:你写完之后就忘了它的存在——它默默帮你干活,你安心做别的事。