1. 为什么需要Python自动化脚本?
作为一个每天要和电脑打交道的程序员,我深知重复性工作有多折磨人。上周我还在手动整理几百个Excel表格,复制粘贴到手抽筋。直到有一天同事看我太惨,甩给我一个20行的Python脚本——原来同样的工作3秒就能搞定。那一刻我顿悟了:不会用Python自动化,等于自愿当人肉机器人。
Python凭借清晰的语法和丰富的库,成为自动化领域的瑞士军刀。无论是处理文件、爬取数据还是操控软件,几十行代码就能把枯燥任务变成一键完成。更重要的是,这些脚本可以反复使用,相当于给自己打造了一套效率工具包。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文件管理自动化
2.1 批量重命名文件
用这个脚本可以瞬间整理杂乱无章的下载文件夹:
python复制import os
def batch_rename(folder_path, prefix):
for count, filename in enumerate(os.listdir(folder_path)):
new_name = f"{prefix}_{str(count).zfill(3)}{os.path.splitext(filename)[1]}"
os.rename(os.path.join(folder_path, filename),
os.path.join(folder_path, new_name))
# 示例:把~/Downloads里的文件统一改成"vacation_001.jpg"的格式
batch_rename("/Users/me/Downloads", "vacation")
注意:运行前建议先备份文件,zfill(3)表示用0补全3位数字
2.2 自动归档文件
这个脚本会按扩展名创建文件夹并分类存放:
python复制from pathlib import Path
def auto_sort(directory):
for item in Path(directory).iterdir():
if item.is_file():
ext = item.suffix[1:] # 去掉点号
(Path(directory)/ext).mkdir(exist_ok=True)
item.rename(Path(directory)/ext/item.name)
# 把桌面文件自动归类
auto_sort("/Users/me/Desktop")
3. 数据处理自动化
3.1 Excel报表自动生成
用openpyxl处理Excel比手动操作快10倍:
python复制from openpyxl import Workbook
def create_report(data):
wb = Workbook()
ws = wb.active
ws.append(["日期", "销售额", "利润"])
for row in data:
ws.append(row)
# 自动计算总和
ws.append(["总计", f"=SUM(B2:B{len(data)+1})",
f"=SUM(C2:C{len(data)+1})"])
wb.save("sales_report.xlsx")
# 示例数据
sales_data = [
["2023-01-01", 15000, 5000],
["2023-01-02", 18000, 6000]
]
create_report(sales_data)
3.2 数据清洗脚本
处理脏数据时这个脚本能救命:
python复制import pandas as pd
def clean_data(input_file):
df = pd.read_csv(input_file)
# 处理缺失值
df.fillna(method='ffill', inplace=True)
# 标准化日期格式
df['date'] = pd.to_datetime(df['date'], errors='coerce')
# 删除重复行
df.drop_duplicates(inplace=True)
# 保存清洗后的数据
df.to_csv("cleaned_data.csv", index=False)
clean_data("dirty_data.csv")
4. 网络操作自动化
4.1 自动网页截图
用Selenium实现定时监控网页变化:
python复制from selenium import webdriver
from datetime import datetime
def capture_screenshot(url, save_path):
driver = webdriver.Chrome()
driver.get(url)
# 获取当前时间作为文件名
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"{save_path}/screenshot_{timestamp}.png"
driver.save_screenshot(filename)
driver.quit()
# 监控某电商页面价格变化
capture_screenshot("https://example.com/product", "/path/to/save")
4.2 简易爬虫模板
爬取数据必备的基础框架:
python复制import requests
from bs4 import BeautifulSoup
def simple_crawler(url, selector):
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
items = soup.select(selector)
results = []
for item in items:
results.append(item.text.strip())
return results
else:
print(f"请求失败,状态码:{response.status_code}")
# 示例:爬取新闻标题
news = simple_crawler("https://news.example.com", "h2.news-title")
print(news)
5. 系统管理自动化
5.1 磁盘空间监控
定时检查服务器磁盘使用情况:
python复制import shutil
import smtplib
from email.mime.text import MIMEText
def check_disk(threshold=80):
usage = shutil.disk_usage("/")
percent_used = (usage.used / usage.total) * 100
if percent_used > threshold:
send_alert(percent_used)
def send_alert(percent):
msg = MIMEText(f"警告!磁盘使用率已达{percent:.1f}%")
msg['Subject'] = '磁盘空间告警'
msg['From'] = 'monitor@example.com'
msg['To'] = 'admin@example.com'
with smtplib.SMTP('smtp.example.com') as server:
server.send_message(msg)
# 添加到crontab定时运行
check_disk()
5.2 进程监控脚本
确保关键服务持续运行:
python复制import psutil
import subprocess
def monitor_process(process_name):
for proc in psutil.process_iter(['name']):
if proc.info['name'] == process_name:
return True
# 进程不存在则自动启动
subprocess.Popen(process_name)
return False
# 监控Nginx服务
monitor_process("nginx")
6. 图像处理自动化
6.1 批量图片压缩
上传网站前自动优化图片:
python复制from PIL import Image
import os
def compress_images(folder, quality=85):
for filename in os.listdir(folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
filepath = os.path.join(folder, filename)
img = Image.open(filepath)
# 保持原尺寸,只调整质量
img.save(filepath, quality=quality, optimize=True)
# 压缩photos文件夹下所有图片
compress_images("photos")
6.2 添加水印
保护版权图片的利器:
python复制from PIL import Image, ImageDraw, ImageFont
def add_watermark(image_path, text):
original = Image.open(image_path)
watermark = Image.new('RGBA', original.size)
draw = ImageDraw.Draw(watermark)
font = ImageFont.truetype("arial.ttf", 36)
# 在右下角添加半透明水印
text_width, text_height = draw.textsize(text, font)
position = (original.width - text_width - 20,
original.height - text_height - 20)
draw.text(position, text, font=font, fill=(255,255,255,128))
# 合并图片
watermarked = Image.alpha_composite(
original.convert('RGBA'), watermark)
watermarked.save(f"watermarked_{image_path}")
add_watermark("photo.jpg", "© Your Name")
7. 办公效率提升
7.1 自动邮件发送
批量发送个性化邮件:
python复制import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
def send_emails(recipients):
server = smtplib.SMTP('smtp.example.com', 587)
server.starttls()
server.login("your_email@example.com", "password")
for name, email in recipients.items():
msg = MIMEMultipart()
msg['From'] = "your_email@example.com"
msg['To'] = email
msg['Subject'] = f"亲爱的{name},这是您的专属邮件"
body = f"""
<html>
<body>
<p>尊敬的{name}:<br><br>
这是为您定制的内容...</p>
</body>
</html>
"""
msg.attach(MIMEText(body, 'html'))
server.send_message(msg)
server.quit()
# 示例收件人列表
contacts = {
"张三": "zhangsan@example.com",
"李四": "lisi@example.com"
}
send_emails(contacts)
7.2 PDF处理工具
合并多个PDF文件:
python复制from PyPDF2 import PdfMerger
def merge_pdfs(input_files, output_file):
merger = PdfMerger()
for pdf in input_files:
merger.append(pdf)
merger.write(output_file)
merger.close()
# 合并季度报告
merge_pdfs(["Q1.pdf", "Q2.pdf", "Q3.pdf"], "annual_report.pdf")
8. 开发效率工具
8.1 自动生成测试数据
快速创建模拟数据用于开发:
python复制from faker import Faker
import csv
def generate_test_data(num_records):
fake = Faker('zh_CN')
with open('test_data.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['姓名', '地址', '电话', '邮箱'])
for _ in range(num_records):
writer.writerow([
fake.name(),
fake.address(),
fake.phone_number(),
fake.email()
])
# 生成100条测试数据
generate_test_data(100)
8.2 代码自动格式化
统一团队代码风格:
python复制import autopep8
from pathlib import Path
def format_code(directory):
for py_file in Path(directory).rglob("*.py"):
with open(py_file, 'r') as f:
original = f.read()
formatted = autopep8.fix_code(original)
with open(py_file, 'w') as f:
f.write(formatted)
# 格式化整个项目目录
format_code("/path/to/project")
9. 生活实用脚本
9.1 自动备份手机照片
连接手机后自动同步照片:
python复制import shutil
from datetime import datetime
import os
def backup_photos(source, destination):
today = datetime.now().strftime("%Y%m%d")
backup_folder = os.path.join(destination, today)
os.makedirs(backup_folder, exist_ok=True)
for photo in os.listdir(source):
if photo.lower().endswith(('.jpg', '.png')):
src_path = os.path.join(source, photo)
dst_path = os.path.join(backup_folder, photo)
shutil.copy2(src_path, dst_path)
# 安卓手机通常挂载在/mnt目录下
backup_photos("/mnt/phone/DCIM", "/backup/photos")
9.2 天气预报提醒
每天早晨推送天气信息:
python复制import requests
from twilio.rest import Client
def weather_alert(city, phone_number):
api_key = "your_openweathermap_key"
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
response = requests.get(url)
data = response.json()
weather = data['weather'][0]['description']
temp = data['main']['temp']
message = f"早上好!{city}今天天气:{weather},气温:{temp}℃"
# 通过Twilio发送短信
client = Client("your_account_sid", "your_auth_token")
client.messages.create(
body=message,
from_="+1234567890",
to=phone_number
)
weather_alert("北京", "+8613800000000")
10. 进阶自动化技巧
10.1 脚本自监控
让脚本自己报告运行状态:
python复制import logging
import socket
from datetime import datetime
def setup_monitoring(script_name):
logger = logging.getLogger(script_name)
logger.setLevel(logging.INFO)
# 创建文件handler
fh = logging.FileHandler(f"{script_name}.log")
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
# 记录启动信息
hostname = socket.gethostname()
logger.info(f"脚本启动于 {hostname}")
return logger
# 使用示例
log = setup_monitoring("my_script")
log.info("开始处理数据...")
10.2 异常自动恢复
增强脚本的健壮性:
python复制import time
import traceback
from requests.exceptions import RequestException
def resilient_operation(max_retries=3):
retries = 0
while retries < max_retries:
try:
# 这里放可能失败的操作
response = requests.get("https://api.example.com/data")
response.raise_for_status()
return response.json()
except RequestException as e:
retries += 1
print(f"尝试 {retries}/{max_retries} 失败: {str(e)}")
traceback.print_exc()
if retries < max_retries:
wait_time = 2 ** retries # 指数退避
print(f"等待 {wait_time}秒后重试...")
time.sleep(wait_time)
raise Exception("操作失败,已达最大重试次数")
data = resilient_operation()
关键经验:把这些脚本保存为模块文件,使用时只需import调用。建议建立一个专属的自动化工具目录,并添加到PYTHONPATH环境变量中
在实际使用中,我发现最影响效率的反而不是写脚本的时间,而是反复调试参数的过程。建议为每个脚本添加详细的命令行参数解析,比如用argparse模块:
python复制import argparse
def main():
parser = argparse.ArgumentParser(description='文件批量重命名工具')
parser.add_argument('folder', help='要处理的文件夹路径')
parser.add_argument('prefix', help='新文件名前缀')
parser.add_argument('--dry-run', action='store_true',
help='试运行不实际修改')
args = parser.parse_args()
if args.dry_run:
print("试运行模式:")
for f in os.listdir(args.folder):
print(f"会将 {f} 重命名为 {args.prefix}_XXX{f[f.find('.'):]}")
else:
batch_rename(args.folder, args.prefix)
if __name__ == "__main__":
main()
这样下次使用时就能通过命令行参数灵活控制,不用每次都修改代码。把这些脚本积累起来,你会发现自己逐渐构建起一个强大的效率工具箱,处理日常工作越来越得心应手
