哪些工作值得写成自动化脚本

不是所有工作都值得自动化。判断标准很简单:这件事你会不会做第二次。如果只是一次性操作,手动做更快;如果你每周都要整理一次报表、每天都要批量重命名文件、每个月都要发几十封邮件——这些就是自动化的目标。

Python 做办公自动化的优势是库多:读写 Excel 用 openpyxl、发邮件用 smtplib、操作文件用标准库 pathlib、定时任务用 schedule 或系统任务计划程序。你不需要学复杂的框架,几十行代码就能解决一个具体问题。

自动化的价值不是写代码本身,而是把你从重复劳动中解放出来去做更有价值的事。
本文核心知识点
  • pathlibPython 3.4+ 内置的路径操作库,比 os.path 更直观。
  • openpyxl读写 Excel .xlsx 文件的标准库。
  • smtplib发送邮件的标准库,配合 email 模块发带附件的邮件。
  • schedule轻量级定时任务库,几行代码搞定周期性执行。
Python 自动化脚本示意:蓝色渐变背景上齿轮组和管线连接文件夹与输出文件面板
自动化脚本的核心:输入文件经过齿轮组(处理逻辑),输出整理好的结果文件——重复工作交给机器。

文件批量处理:重命名与整理

最常见的自动化需求是文件整理。比如下载文件夹里有几百张照片,文件名是相机自动生成的 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 后会给一个授权码,用它代替密码登录。要发给多人时,把收件人列表放进去循环发送即可。