1. 为什么你需要Python自动化脚本?
作为一个每天和键盘打交道的程序员,我深刻理解重复性工作带来的痛苦。那些每周都要手动执行的报表生成、文件整理、数据清洗任务,不仅消耗时间,还容易出错。直到五年前我开始系统性地用Python编写自动化脚本,工作效率直接翻了三倍。
Python在自动化领域的优势非常明显:语法简洁、生态丰富、跨平台支持完善。根据2023年Stack Overflow开发者调查,Python连续七年成为最受欢迎的编程语言,其中自动化脚本正是其核心应用场景之一。我精选的这10个脚本覆盖了文件处理、办公自动化、网络爬虫等高频需求,每个都经过我实际项目验证。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与工具选型
2.1 Python环境配置
推荐使用Python 3.8+版本,这是目前企业环境中兼容性最好的稳定版本。通过以下命令检查版本:
bash复制python --version
如果尚未安装,建议:
- 官网下载安装包(注意勾选"Add Python to PATH")
- 安装完成后验证pip是否可用:
bash复制pip --version
注意:Windows用户建议使用PowerShell替代CMD,避免路径相关的问题
2.2 开发工具选择
- VSCode:轻量级但功能强大,安装Python扩展后支持智能提示
- PyCharm:专业版对自动化脚本调试更友好
- Jupyter Notebook:适合数据清洗类脚本的交互式开发
我的个人配置组合是VSCode + Jupyter插件,既保持轻量又获得交互式开发体验。
3. 文件管理自动化三件套
3.1 智能文件分类器
这个脚本可以自动根据扩展名整理下载文件夹:
python复制import os
import shutil
def auto_sort(download_path="~/Downloads"):
file_types = {
'images': ['.jpg', '.png'],
'documents': ['.pdf', '.docx']
}
for filename in os.listdir(download_path):
if os.path.isfile(os.path.join(download_path, filename)):
ext = os.path.splitext(filename)[1].lower()
for folder, extensions in file_types.items():
if ext in extensions:
target_dir = os.path.join(download_path, folder)
os.makedirs(target_dir, exist_ok=True)
shutil.move(
os.path.join(download_path, filename),
os.path.join(target_dir, filename)
)
优化技巧:
- 添加
exist_ok=True避免重复创建文件夹报错 - 使用
os.path.join确保跨平台路径兼容性 - 可以扩展
file_types字典支持更多文件类型
3.2 重复文件清理工具
通过MD5校验识别重复文件:
python复制import hashlib
import os
def find_duplicates(root_dir):
hashes = {}
for dirpath, _, filenames in os.walk(root_dir):
for filename in filenames:
path = os.path.join(dirpath, filename)
with open(path, 'rb') as f:
file_hash = hashlib.md5(f.read()).hexdigest()
if file_hash in hashes:
print(f"Duplicate found: {path} and {hashes[file_hash]}")
else:
hashes[file_hash] = path
警告:执行前建议先备份,该操作不可逆
3.3 自动备份脚本
结合zipfile实现增量备份:
python复制import zipfile
import datetime
import os
def backup(source_dir, target_dir):
today = datetime.date.today()
zip_name = f"backup_{today.strftime('%Y%m%d')}.zip"
with zipfile.ZipFile(os.path.join(target_dir, zip_name), 'w') as zipf:
for root, dirs, files in os.walk(source_dir):
for file in files:
zipf.write(os.path.join(root, file))
可以配合Windows任务计划或Linux crontab实现定时自动备份。
4. 办公自动化实战
4.1 Excel报表生成器
使用openpyxl处理Excel:
python复制from openpyxl import Workbook
import datetime
def create_report(data):
wb = Workbook()
ws = wb.active
ws.title = "Sales Report"
# 添加标题行
headers = ['Date', 'Product', 'Revenue']
ws.append(headers)
# 填充数据
for row in data:
ws.append(row)
# 自动调整列宽
for col in ws.columns:
max_length = 0
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(cell.value)
except:
pass
adjusted_width = (max_length + 2)
ws.column_dimensions[col[0].column_letter].width = adjusted_width
filename = f"report_{datetime.datetime.now().strftime('%Y%m%d')}.xlsx"
wb.save(filename)
性能优化:
- 对于超过万行数据,建议使用
write_only=True模式 - 大数据量时考虑使用pandas+openpyxl组合方案
4.2 邮件自动发送系统
通过smtplib实现邮件自动化:
python复制import smtplib
from email.mime.text import MIMEText
from email.header import Header
def send_email(subject, content, to_list):
mail_host = "smtp.example.com"
mail_user = "your_email@example.com"
mail_pass = "your_password"
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = Header(mail_user)
message['To'] = ", ".join(to_list)
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP_SSL(mail_host, 465)
smtpObj.login(mail_user, mail_pass)
smtpObj.sendmail(mail_user, to_list, message.as_string())
print("邮件发送成功")
except smtplib.SMTPException as e:
print(f"Error: 无法发送邮件 - {e}")
安全提示:不要在代码中硬编码密码,建议使用环境变量或配置文件
4.3 PDF批量处理工具
用PyPDF2合并多个PDF:
python复制from PyPDF2 import PdfMerger
import os
def merge_pdfs(input_folder, output_filename):
merger = PdfMerger()
for item in os.listdir(input_folder):
if item.endswith('.pdf'):
merger.append(os.path.join(input_folder, item))
merger.write(output_filename)
merger.close()
扩展功能建议:
- 添加页码水印
- 批量加密保护
- OCR文字识别
5. 网络自动化利器
5.1 智能网页抓取器
使用requests+BeautifulSoup的基础爬虫:
python复制import requests
from bs4 import BeautifulSoup
def simple_crawler(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# 示例:提取所有链接
for link in soup.find_all('a'):
print(link.get('href'))
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
反爬应对策略:
- 设置随机User-Agent
- 使用代理IP池
- 添加合理的请求间隔
5.2 API自动化测试框架
基于requests的轻量级测试框架:
python复制import requests
import json
class APITester:
def __init__(self, base_url):
self.base_url = base_url
self.session = requests.Session()
def test_endpoint(self, method, endpoint, expected_status=200, **kwargs):
url = f"{self.base_url}{endpoint}"
try:
response = self.session.request(method, url, **kwargs)
assert response.status_code == expected_status
return response.json()
except Exception as e:
print(f"测试失败: {e}")
return None
# 使用示例
tester = APITester("https://api.example.com")
result = tester.test_endpoint("GET", "/users", params={"page": 1})
扩展方向:
- 添加结果验证逻辑
- 集成Allure生成测试报告
- 支持YAML测试用例配置
6. 系统管理自动化
6.1 服务器监控脚本
用psutil获取系统指标:
python复制import psutil
import time
def monitor_system(interval=5):
while True:
cpu_percent = psutil.cpu_percent(interval=1)
mem = psutil.virtual_memory()
disk = psutil.disk_usage('/')
print(f"CPU使用率: {cpu_percent}%")
print(f"内存使用: {mem.used/1024/1024:.2f}MB / {mem.total/1024/1024:.2f}MB")
print(f"磁盘空间: {disk.used/1024/1024:.2f}MB / {disk.total/1024/1024:.2f}MB")
time.sleep(interval)
# 后台运行建议:nohup python monitor.py &
生产级改进:
- 添加日志记录功能
- 设置阈值告警
- 集成Prometheus指标暴露
6.2 批量文件内容替换
跨文件搜索替换工具:
python复制import fileinput
import os
import re
def batch_replace(root_dir, pattern, replacement):
for dirpath, _, filenames in os.walk(root_dir):
for filename in filenames:
if filename.endswith('.txt'):
filepath = os.path.join(dirpath, filename)
with fileinput.FileInput(filepath, inplace=True) as file:
for line in file:
print(re.sub(pattern, replacement, line), end='')
安全提示:
- 操作前建议先备份
- 可以先打印预览不实际修改
7. 图像处理自动化
7.1 批量图片压缩
使用Pillow优化图片体积:
python复制from PIL import Image
import os
def compress_images(input_dir, output_dir, quality=85):
os.makedirs(output_dir, exist_ok=True)
for filename in os.listdir(input_dir):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
img_path = os.path.join(input_dir, filename)
with Image.open(img_path) as img:
output_path = os.path.join(output_dir, filename)
img.save(output_path, quality=quality, optimize=True)
进阶技巧:
- 根据图片尺寸自动调整质量参数
- 添加WebP格式转换选项
- 支持多线程加速处理
8. 数据库自动化运维
8.1 MySQL自动备份
结合pymysql的备份方案:
python复制import pymysql
import subprocess
import datetime
def mysql_backup(host, user, password, database):
today = datetime.datetime.now().strftime('%Y%m%d')
dump_file = f"{database}_{today}.sql"
try:
subprocess.run([
'mysqldump',
f'-h{host}',
f'-u{user}',
f'-p{password}',
database,
f'--result-file={dump_file}'
], check=True)
print(f"备份成功: {dump_file}")
except subprocess.CalledProcessError as e:
print(f"备份失败: {e}")
生产环境建议:
- 使用配置文件存储敏感信息
- 添加备份文件自动清理逻辑
- 支持远程SFTP存储
9. 自动化脚本工程化建议
9.1 错误处理最佳实践
健壮性增强方案:
python复制import logging
import sys
from functools import wraps
def setup_logging():
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('automation.log'),
logging.StreamHandler(sys.stdout)
]
)
def handle_errors(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
logging.error(f"执行失败: {str(e)}", exc_info=True)
raise
return wrapper
# 使用示例
@handle_errors
def critical_operation():
pass
9.2 配置管理方案
推荐使用configparser:
python复制import configparser
config = configparser.ConfigParser()
config.read('config.ini')
# 获取配置示例
db_host = config.get('database', 'host')
10. 脚本调度与监控
10.1 Windows任务计划配置
创建定时任务步骤:
- 打开"任务计划程序"
- 创建基本任务
- 设置触发器(如每天8点)
- 操作为"启动程序"
- 指定python解释器路径和脚本路径
10.2 Linux crontab设置
编辑crontab:
bash复制crontab -e
添加如下行(每天凌晨2点执行):
code复制0 2 * * * /usr/bin/python3 /path/to/script.py >> /var/log/automation.log 2>&1
日志管理技巧:
- 使用logrotate防止日志膨胀
- 添加邮件告警机制
- 集成Sentry错误监控
11. 性能优化实战
11.1 多线程加速文件处理
ThreadPoolExecutor示例:
python复制from concurrent.futures import ThreadPoolExecutor
import os
def process_file(filepath):
# 文件处理逻辑
pass
def batch_process(input_dir, workers=4):
files = [os.path.join(input_dir, f) for f in os.listdir(input_dir)]
with ThreadPoolExecutor(max_workers=workers) as executor:
executor.map(process_file, files)
注意事项:
- I/O密集型任务适合多线程
- CPU密集型建议用multiprocessing
- 注意线程安全问题和资源竞争
11.2 内存优化技巧
处理大文件时的内存管理:
python复制def process_large_file(filepath):
with open(filepath, 'r') as f:
for line in f: # 逐行读取避免内存爆炸
process_line(line)
12. 安全防护方案
12.1 敏感信息处理
使用python-dotenv管理密钥:
python复制from dotenv import load_dotenv
import os
load_dotenv() # 加载.env文件
api_key = os.getenv('API_KEY') # 安全获取密钥
.env文件示例:
code复制API_KEY=your_actual_key_here
12.2 脚本权限控制
Linux下设置最小权限:
bash复制chmod 750 script.py # 仅允许所有者完全控制,组用户读执行
sudo chown root:root script.py # 必要时变更所有者
13. 异常场景处理
13.1 网络请求重试机制
带指数退避的重试装饰器:
python复制import time
import random
from functools import wraps
def retry(max_retries=3, delay=1, backoff=2):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
retries = 0
while retries < max_retries:
try:
return func(*args, **kwargs)
except Exception as e:
retries += 1
if retries == max_retries:
raise
sleep_time = delay * (backoff ** retries) + random.uniform(0, 0.1)
time.sleep(sleep_time)
return wrapper
return decorator
14. 跨平台兼容方案
14.1 路径处理最佳实践
使用pathlib替代os.path:
python复制from pathlib import Path
def safe_path_operation():
downloads = Path.home() / 'Downloads'
new_file = downloads / 'data.txt'
with new_file.open('w') as f:
f.write('content')
优势:
- 更直观的路径拼接
- 自动处理平台差异
- 丰富的路径操作方法
15. 持续集成方案
15.1 GitHub Actions自动化
基础工作流配置示例:
yaml复制name: Python Automation
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.8'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: |
python -m pytest tests/
16. 实用调试技巧
16.1 日志调试法
结构化日志配置:
python复制import logging
from logging.handlers import RotatingFileHandler
def setup_advanced_logging():
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 控制台输出
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 文件输出
file_handler = RotatingFileHandler(
'debug.log',
maxBytes=1024*1024,
backupCount=5
)
file_handler.setLevel(logging.DEBUG)
# 格式化
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logger.addHandler(file_handler)
17. 代码质量保障
17.1 静态检查配置
pre-commit钩子示例:
yaml复制repos:
- repo: https://github.com/psf/black
rev: 22.3.0
hooks:
- id: black
language_version: python3.8
- repo: https://github.com/PyCQA/flake8
rev: 4.0.1
hooks:
- id: flake8
18. 打包分发方案
18.1 PyInstaller打包
单文件打包命令:
bash复制pyinstaller --onefile --clean --noconsole script.py
注意事项:
- 处理依赖问题可以添加
--hidden-import - 图形界面程序去掉
--noconsole - 跨平台打包需要在目标系统执行
19. 性能监控方案
19.1 执行时间统计
上下文管理器实现:
python复制import time
from contextlib import contextmanager
@contextmanager
def timeit(name):
start = time.perf_counter()
try:
yield
finally:
duration = time.perf_counter() - start
print(f"{name} took {duration:.2f} seconds")
使用示例:
python复制with timeit("文件处理"):
process_files()
20. 脚本维护建议
保持脚本可维护性的关键点:
- 添加清晰的模块文档字符串
- 使用类型注解提高可读性
- 遵循PEP8代码风格
- 编写单元测试
- 使用版本控制管理变更
示例类型注解:
python复制from typing import List, Dict
def process_data(items: List[Dict[str, str]]) -> int:
"""处理数据并返回有效记录数
Args:
items: 字典列表,每个字典代表一条记录
Returns:
处理成功的记录数量
"""
return len([item for item in items if validate(item)])
在实际项目中,我建议将这些脚本组织成Python包结构,通过命令行接口(CLI)暴露主要功能。例如使用Click库构建命令行工具:
python复制import click
@click.group()
def cli():
pass
@cli.command()
@click.argument('input_dir')
@click.argument('output_dir')
def compress_images(input_dir, output_dir):
"""批量压缩图片"""
pass
if __name__ == '__main__':
cli()
这样可以通过python tools.py compress-images input output的方式调用,更适合生产环境使用。
