Python 自动化脚本编写是提高工作效率的重要手段。无论是数据处理、文件操作还是网络请求,Python 都能轻松应对。本文将通过五个实战案例,带你逐步掌握 Python 自动化脚本的编写方法。
案例一:批量重命名文件
(1) 问题描述
假设你有一个文件夹,里面有很多图片文件,但文件名杂乱无章。你需要将这些文件按顺序重命名,例如 image1.jpg, image2.jpg 等。
(2) 解决方案
我们可以使用 Python 的 os 模块来实现文件重命名。
import os
# 定义文件夹路径
folder_path = 'path/to/your/folder'
# 获取文件夹中的所有文件
files = os.listdir(folder_path)
# 过滤出图片文件(假设只有 .jpg 格式)
image_files = [f for f in files if f.endswith('.jpg')]
# 按文件名排序
image_files.sort()
# 重命名文件
for i, file_name in enumerate(image_files):
# 构建新的文件名
new_name = f'image{i + 1}.jpg'
# 构建完整路径
old_path = os.path.join(folder_path, file_name)
new_path = os.path.join(folder_path, new_name)
# 重命名文件
os.rename(old_path, new_path)
print(f'Renamed {file_name} to {new_name}')
(3) 代码解释
- os.listdir(folder_path):获取指定文件夹中的所有文件名。
- f.endswith('.jpg'):过滤出以 .jpg 结尾的文件。
- os.rename(old_path, new_path):将文件从旧路径重命名为新路径。
案例二:定时发送邮件
(1) 问题描述
假设你需要每天定时发送一封包含最新报告的邮件给客户。
(2) 解决方案
我们可以使用 smtplib 和 email 模块来发送邮件,并使用 schedule 模块来定时执行任务。
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import schedule
import time
# 邮件配置
smtp_server = 'smtp.example.com'
smtp_port = 587
smtp_user = 'your_email@example.com'
smtp_password = 'your_password'
to_email = 'client_email@example.com'
def send_email():
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = smtp_user
msg['To'] = to_email
msg['Subject'] = 'Daily Report'
# 添加邮件正文
body = 'Here is the latest report.'
msg.attach(MIMEText(body, 'plain'))
# 发送邮件
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(smtp_user, smtp_password)
server.sendmail(smtp_user, to_email, msg.as_string())
print('Email sent successfully')
# 定时任务
schedule.every().day.at("10:00").do(send_email)
while True:
schedule.run_pending()
time.sleep(1)
(3) 代码解释
- MIMEMultipart():创建一个多部分的邮件对象。
- msg.attach(MIMEText(body, 'plain')):添加邮件正文。
- server.starttls():启用 TLS 加密。
- schedule.every().day.at("10:00").do(send_email):每天 10:00 执行 send_email 函数。
案例三:数据抓取和处理
(1) 问题描述
假设你需要从一个网站上抓取数据,并将其保存到本地文件中。
(2) 解决方案
我们可以使用 requests 和 BeautifulSoup 模块来抓取网页数据,并使用 pandas 模块来处理数据。
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 目标 URL
url = 'https://example.com/data'
# 发送请求
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
# 解析 HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 提取数据
data = []
table = soup.find('table')
rows = table.find_all('tr')
for row in rows:
cols = row.find_all('td')
cols = [col.text.strip() for col in cols]
data.append(cols)
# 转换为 DataFrame
df = pd.DataFrame(data[1:], columns=data[0])
# 保存到 CSV 文件
df.to_csv('data.csv', index=False)
print('Data saved to data.csv')
(3) 代码解释
- requests.get(url):发送 HTTP GET 请求。
- BeautifulSoup(response.text, 'html.parser'):解析 HTML 内容。
- table.find_all('tr'):找到所有的表格行。
- df.to_csv('data.csv', index=False):将数据保存到 CSV 文件。
案例四:自动化测试
(1) 问题描述
假设你需要对一个 Web 应用进行自动化测试,验证其功能是否正常。
(2) 解决方案
我们可以使用 Selenium 模块来模拟用户操作。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
# 配置 WebDriver
driver = webdriver.Chrome()
# 打开目标网站
driver.get('https://example.com/login')
# 输入用户名和密码
username_input = driver.find_element(By.NAME, 'username')
password_input = driver.find_element(By.NAME, 'password')
username_input.send_keys('test_user')
password_input.send_keys('test_password')
# 提交表单
password_input.send_keys(Keys.RETURN)
# 等待页面加载
time.sleep(2)
# 检查登录是否成功
if 'Dashboard' in driver.page_source:
print('Login successful')
else:
print('Login failed')
# 关闭浏览器
driver.quit()
(3) 代码解释
- webdriver.Chrome():启动 Chrome 浏览器。
- driver.find_element(By.NAME, 'username'):找到用户名输入框。
- username_input.send_keys('test_user'):输入用户名。
- password_input.send_keys(Keys.RETURN):提交表单。
- driver.page_source:获取当前页面的源代码。
案例五:自动化备份数据库
(1) 问题描述
假设你需要定期备份 MySQL 数据库,并将备份文件上传到云存储服务。
(2) 解决方案
我们可以使用 subprocess 模块来执行命令行操作,并使用 boto3 模块来上传文件到 Amazon S3。
import subprocess
import boto3
import os
import datetime
# 数据库配置
db_host = 'localhost'
db_user = 'root'
db_password = 'password'
db_name = 'mydatabase'
# S3 配置
s3_bucket = 'your-bucket-name'
s3_key = 'backups/'
# 生成备份文件名
backup_file = f'{db_name}_{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}.sql'
# 执行备份命令
backup_command = f'mysqldump -h {db_host} -u {db_user} -p{db_password} {db_name} > {backup_file}'
subprocess.run(backup_command, shell=True, check=True)
print(f'Database backup created: {backup_file}')
# 上传到 S3
s3 = boto3.client('s3')
s3.upload_file(backup_file, s3_bucket, s3_key + backup_file)
print(f'Backup uploaded to S3: {s3_key + backup_file}')
# 删除本地备份文件
os.remove(backup_file)
print('Local backup file deleted')
(3) 代码解释
- subprocess.run(backup_command, shell=True, check=True):执行备份命令。
- boto3.client('s3'):创建 S3 客户端。
- s3.upload_file(backup_file, s3_bucket, s3_key + backup_file):上传文件到 S3。
- os.remove(backup_file):删除本地备份文件。
实战案例:自动化生成报表并发送邮件
(1) 问题描述
假设你需要每天生成一份销售报表,并将其发送给管理层。
(2) 解决方案
我们可以结合前面的案例,使用 pandas 处理数据,使用 matplotlib 生成图表,使用 smtplib 发送邮件。
import pandas as pd
import matplotlib.pyplot as plt
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
import schedule
import time
# 读取销售数据
sales_data = pd.read_csv('sales_data.csv')
# 生成图表
plt.figure(figsize=(10, 6))
plt.plot(sales_data['date'], sales_data['amount'])
plt.title('Sales Report')
plt.xlabel('Date')
plt.ylabel('Amount')
plt.savefig('sales_report.png')
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = 'your_email@example.com'
msg['To'] = 'manager_email@example.com'
msg['Subject'] = 'Daily Sales Report'
# 添加邮件正文
body = 'Please find the attached sales report.'
msg.attach(MIMEText(body, 'plain'))
# 添加附件
with open('sales_report.png', 'rb') as f:
img = MIMEApplication(f.read(), _subtype='png')
img.add_header('Content-Disposition', 'attachment', filename='sales_report.png')
msg.attach(img)
# 发送邮件
with smtplib.SMTP('smtp.example.com', 587) as server:
server.starttls()
server.login('your_email@example.com', 'your_password')
server.sendmail('your_email@example.com', 'manager_email@example.com', msg.as_string())
print('Email sent successfully')
# 定时任务
schedule.every().day.at("12:00").do(send_email)
while True:
schedule.run_pending()
time.sleep(1)
(3) 代码解释
- pd.read_csv('sales_data.csv'):读取销售数据。
- plt.plot(sales_data['date'], sales_data['amount']):生成销售图表。
- MIMEApplication(f.read(), _subtype='png'):创建附件。
- schedule.every().day.at("12:00").do(send_email):每天 12:00 执行 send_email 函数。
总结
本文通过五个实战案例,详细介绍了如何使用 Python 编写自动化脚本。从批量重命名文件、定时发送邮件、数据抓取和处理、自动化测试到自动化备份数据库,每个案例都提供了详细的代码示例和解释。最后,我们还提供了一个综合实战案例,展示了如何生成报表并发送邮件。