1. 为什么你需要Python自动化脚本?
作为一个长期与重复性工作搏斗的程序员,我深刻理解那种每天被琐碎任务支配的恐惧。记得有一次,我需要手动整理300多个Excel文件的数据,复制粘贴到手抽筋,眼睛都快看花了。直到我写下了人生第一个Python自动化脚本——从此打开了新世界的大门。
Python之所以成为自动化领域的王者,主要得益于几个关键优势:
- 语法简洁直观,学习曲线平缓
- 丰富的标准库和第三方模块覆盖几乎所有场景
- 跨平台特性让脚本可以在不同系统运行
- 强大的社区支持,遇到问题随时能找到解决方案
根据2023年Stack Overflow开发者调查,Python已经连续六年成为最受欢迎的编程语言之一,其中自动化任务正是其最广泛的应用场景。下面这10个脚本,都是我实际工作中反复打磨的"生产力工具",每个都能帮你节省至少2小时/周的重复劳动。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文件管理自动化:告别手动整理
2.1 智能文件分类器
这个脚本可以自动扫描指定目录,根据文件扩展名创建对应文件夹,并将文件归类存放。我给它增加了智能识别功能:
python复制import os
import shutil
def auto_classify(directory):
for filename in os.listdir(directory):
if os.path.isfile(os.path.join(directory, filename)):
ext = filename.split('.')[-1].lower()
target_dir = os.path.join(directory, ext)
if not os.path.exists(target_dir):
os.makedirs(target_dir)
shutil.move(
os.path.join(directory, filename),
os.path.join(target_dir, filename)
)
print(f"Moved {filename} to {ext}/")
# 使用示例
auto_classify('/Users/yourname/Downloads')
提示:可以扩展这个脚本,为特定文件类型添加特殊处理逻辑。比如自动解压zip文件后删除原文件。
2.2 重复文件查找器
这个脚本会计算文件的MD5哈希值,找出目录中的重复文件:
python复制import hashlib
import os
def find_duplicates(directory):
hashes = {}
duplicates = []
for root, dirs, files in os.walk(directory):
for filename in files:
path = os.path.join(root, filename)
with open(path, 'rb') as f:
file_hash = hashlib.md5(f.read()).hexdigest()
if file_hash in hashes:
duplicates.append((path, hashes[file_hash]))
else:
hashes[file_hash] = path
return duplicates
实测在整理照片库时,这个脚本帮我找出了800多张重复照片,节省了至少15GB空间。
3. 数据处理自动化:Excel/CSV不再头疼
3.1 Excel报表自动生成器
使用openpyxl库自动生成带格式的Excel报表:
python复制from openpyxl import Workbook
from openpyxl.styles import Font, Alignment
def generate_report(data, output_file):
wb = Workbook()
ws = wb.active
# 设置标题行
headers = ['日期', '销售额', '利润']
ws.append(headers)
# 设置标题样式
for cell in ws[1]:
cell.font = Font(bold=True)
cell.alignment = Alignment(horizontal='center')
# 填充数据
for row in data:
ws.append(row)
# 自动调整列宽
for col in ws.columns:
max_length = 0
column = col[0].column_letter
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = (max_length + 2) * 1.2
ws.column_dimensions[column].width = adjusted_width
wb.save(output_file)
这个脚本生成的报表可以直接发给领导,省去了手动调整格式的麻烦。
3.2 CSV数据清洗工具
处理脏数据是数据分析中最耗时的环节之一。这个脚本可以自动完成常见的数据清洗工作:
python复制import pandas as pd
def clean_csv(input_file, output_file):
df = pd.read_csv(input_file)
# 处理空值
df.fillna(method='ffill', inplace=True)
# 标准化日期格式
if 'date' in df.columns:
df['date'] = pd.to_datetime(df['date'], errors='coerce')
# 删除重复行
df.drop_duplicates(inplace=True)
# 保存清洗后的数据
df.to_csv(output_file, index=False)
我每周要用这个脚本处理几十个CSV文件,效率提升了至少10倍。
4. 网络自动化:解放你的浏览器
4.1 网页内容抓取器
使用requests和BeautifulSoup实现简单的网页抓取:
python复制import requests
from bs4 import BeautifulSoup
def scrape_website(url, selector):
try:
response = requests.get(url)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
elements = soup.select(selector)
return [elem.get_text(strip=True) for elem in elements]
except Exception as e:
print(f"Error scraping {url}: {e}")
return []
注意:使用爬虫要遵守网站的robots.txt规则,避免高频请求导致IP被封。
4.2 自动填写网页表单
用selenium实现自动登录和表单提交:
python复制from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def auto_login(url, username, password):
driver = webdriver.Chrome()
driver.get(url)
try:
username_field = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "username"))
)
password_field = driver.find_element(By.ID, "password")
submit_button = driver.find_element(By.ID, "login-btn")
username_field.send_keys(username)
password_field.send_keys(password)
submit_button.click()
print("Login successful")
except Exception as e:
print(f"Login failed: {e}")
finally:
driver.quit()
这个脚本特别适合需要每天登录多个系统的工作场景。
5. 系统管理自动化:告别重复配置
5.1 服务器监控脚本
这个脚本会检查服务器的关键指标,并在异常时发送警报:
python复制import psutil
import smtplib
from email.mime.text import MIMEText
def check_server():
alerts = []
# CPU检查
if psutil.cpu_percent(interval=1) > 90:
alerts.append("CPU usage over 90%")
# 内存检查
mem = psutil.virtual_memory()
if mem.percent > 90:
alerts.append(f"Memory usage {mem.percent}%")
# 磁盘检查
disk = psutil.disk_usage('/')
if disk.percent > 90:
alerts.append(f"Disk usage {disk.percent}%")
if alerts:
send_alert(alerts)
def send_alert(messages):
msg = MIMEText("\n".join(messages))
msg['Subject'] = 'Server Alert'
msg['From'] = 'monitor@example.com'
msg['To'] = 'admin@example.com'
with smtplib.SMTP('smtp.example.com') as server:
server.send_message(msg)
可以设置cron任务每小时运行一次,相当于一个简易版的监控系统。
5.2 批量重命名工具
这个脚本可以按照指定规则批量重命名文件:
python复制import os
import re
def batch_rename(directory, pattern, replacement):
for filename in os.listdir(directory):
if re.search(pattern, filename):
new_name = re.sub(pattern, replacement, filename)
os.rename(
os.path.join(directory, filename),
os.path.join(directory, new_name)
)
print(f"Renamed {filename} to {new_name}")
支持正则表达式,特别适合整理下载的电影或音乐文件。
6. 办公自动化:提升文档处理效率
6.1 Word文档批量处理
使用python-docx自动生成多个Word文档:
python复制from docx import Document
def generate_docs(template_file, data_list, output_dir):
template = Document(template_file)
for data in data_list:
doc = Document()
# 复制模板内容
for element in template.element.body:
doc.element.body.append(element)
# 替换占位符
for paragraph in doc.paragraphs:
for key, value in data.items():
if f'{{{{{key}}}}}' in paragraph.text:
paragraph.text = paragraph.text.replace(f'{{{{{key}}}}}', str(value))
# 保存文档
doc.save(f"{output_dir}/{data['name']}.docx")
我用来批量生成上百份合同,只需要准备好数据模板,剩下的交给脚本。
6.2 PDF合并与拆分工具
用PyPDF2处理PDF文件:
python复制from PyPDF2 import PdfMerger, PdfReader, PdfWriter
def merge_pdfs(file_list, output_file):
merger = PdfMerger()
for file in file_list:
merger.append(file)
merger.write(output_file)
merger.close()
def split_pdf(input_file, output_prefix, pages_per_file):
reader = PdfReader(input_file)
total_pages = len(reader.pages)
for i in range(0, total_pages, pages_per_file):
writer = PdfWriter()
for j in range(i, min(i + pages_per_file, total_pages)):
writer.add_page(reader.pages[j])
output_file = f"{output_prefix}_{i//pages_per_file + 1}.pdf"
with open(output_file, 'wb') as f:
writer.write(f)
律师朋友告诉我,这个脚本帮他节省了大量处理法律文件的时间。
7. 图像处理自动化:批量操作不再繁琐
7.1 图片批量压缩工具
使用Pillow优化图片大小:
python复制from PIL import Image
import os
def compress_images(input_dir, output_dir, quality=85):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for filename in os.listdir(input_dir):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
try:
img_path = os.path.join(input_dir, filename)
img = Image.open(img_path)
output_path = os.path.join(output_dir, filename)
img.save(output_path, quality=quality, optimize=True)
print(f"Compressed {filename}")
except Exception as e:
print(f"Error processing {filename}: {e}")
我的博客图片从平均500KB降到了150KB,页面加载速度快了3倍。
7.2 水印批量添加工具
给图片批量添加水印:
python复制from PIL import Image, ImageDraw, ImageFont
import os
def add_watermark(input_dir, output_dir, watermark_text):
font = ImageFont.truetype('arial.ttf', 36)
for filename in os.listdir(input_dir):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
try:
img = Image.open(os.path.join(input_dir, filename))
draw = ImageDraw.Draw(img)
# 计算水印位置(右下角)
text_width, text_height = draw.textsize(watermark_text, font)
x = img.width - text_width - 10
y = img.height - text_height - 10
# 添加水印
draw.text((x, y), watermark_text, font=font, fill=(255, 255, 255, 128))
img.save(os.path.join(output_dir, filename))
print(f"Added watermark to {filename}")
except Exception as e:
print(f"Error processing {filename}: {e}")
摄影师朋友用这个脚本处理活动照片,省去了手动添加水印的麻烦。
8. 邮件自动化:告别手动发邮件
8.1 批量邮件发送工具
使用smtplib发送个性化邮件:
python复制import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def send_bulk_emails(sender, recipients, subject, template, smtp_server):
with smtplib.SMTP(smtp_server) as server:
for recipient in recipients:
msg = MIMEMultipart()
msg['From'] = sender
msg['To'] = recipient['email']
msg['Subject'] = subject
# 个性化邮件内容
body = template.format(**recipient)
msg.attach(MIMEText(body, 'plain'))
server.send_message(msg)
print(f"Sent email to {recipient['email']}")
市场团队用这个脚本每月发送上千封个性化营销邮件,打开率提升了20%。
8.2 邮件自动回复机器人
用imaplib实现简单的自动回复:
python复制import imaplib
import email
from email.header import decode_header
def auto_reply(email_account, password, reply_template):
mail = imaplib.IMAP4_SSL('imap.example.com')
mail.login(email_account, password)
mail.select('inbox')
status, messages = mail.search(None, 'UNSEEN')
if status == 'OK':
for num in messages[0].split():
status, data = mail.fetch(num, '(RFC822)')
if status == 'OK':
msg = email.message_from_bytes(data[0][1])
subject = decode_header(msg['Subject'])[0][0]
if isinstance(subject, bytes):
subject = subject.decode()
# 构造回复
reply = MIMEText(reply_template)
reply['From'] = email_account
reply['To'] = msg['From']
reply['Subject'] = f"Re: {subject}"
# 发送回复
with smtplib.SMTP('smtp.example.com') as server:
server.send_message(reply)
print(f"Replied to {msg['From']}")
mail.close()
mail.logout()
适合设置假期自动回复,或者处理常见咨询问题。
9. 社交媒体自动化:定时发布不再忘记
9.1 Twitter自动发布工具
使用tweepy库实现定时发推:
python复制import tweepy
import schedule
import time
def tweet(text):
auth = tweepy.OAuthHandler('API_KEY', 'API_SECRET')
auth.set_access_token('ACCESS_TOKEN', 'ACCESS_SECRET')
api = tweepy.API(auth)
api.update_status(text)
print(f"Tweeted: {text}")
# 设置定时任务
schedule.every().day.at("09:00").do(tweet, "Good morning! #Python")
schedule.every().day.at("18:00").do(tweet, "Time to wrap up! #Coding")
while True:
schedule.run_pending()
time.sleep(60)
我的技术博客用这个脚本保持Twitter账号活跃,粉丝互动量明显提升。
9.2 Instagram图片自动发布
虽然Instagram API限制较多,但我们可以用selenium模拟操作:
python复制from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
def post_to_instagram(username, password, image_path, caption):
driver = webdriver.Chrome()
driver.get('https://www.instagram.com/')
try:
# 登录
time.sleep(2)
username_field = driver.find_element_by_name('username')
password_field = driver.find_element_by_name('password')
username_field.send_keys(username)
password_field.send_keys(password)
password_field.send_keys(Keys.RETURN)
# 上传图片
time.sleep(5)
driver.find_element_by_css_selector('svg[aria-label="New Post"]').click()
upload = driver.find_element_by_css_selector('input[type="file"]')
upload.send_keys(image_path)
time.sleep(2)
driver.find_element_by_css_selector('button[type="button"]').click()
time.sleep(1)
driver.find_element_by_css_selector('button[type="button"]').click()
# 添加描述并发布
caption_field = driver.find_element_by_css_selector('textarea')
caption_field.send_keys(caption)
driver.find_element_by_css_selector('button[type="submit"]').click()
print("Post published successfully")
except Exception as e:
print(f"Error posting to Instagram: {e}")
finally:
driver.quit()
注意:使用自动化工具操作社交媒体要遵守平台规则,避免被封号。
10. 进阶技巧:让脚本更智能可靠
10.1 错误处理与日志记录
健壮的脚本应该有完善的错误处理和日志功能:
python复制import logging
from datetime import datetime
def setup_logger(name):
logger = logging.getLogger(name)
logger.setLevel(logging.INFO)
# 创建文件handler
log_file = f"{name}_{datetime.now().strftime('%Y%m%d')}.log"
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(logging.INFO)
# 创建控制台handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.ERROR)
# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 添加handler
logger.addHandler(file_handler)
logger.addHandler(console_handler)
return logger
# 使用示例
logger = setup_logger('my_script')
try:
# 脚本逻辑
logger.info("Script started")
except Exception as e:
logger.error(f"Script failed: {e}", exc_info=True)
10.2 将脚本打包为可执行文件
用PyInstaller把Python脚本变成独立的exe:
bash复制pip install pyInstaller
pyinstaller --onefile your_script.py
这样即使没有Python环境的电脑也能运行你的脚本。
10.3 添加图形界面
使用tkinter为脚本创建简单GUI:
python复制import tkinter as tk
from tkinter import filedialog
class ScriptGUI:
def __init__(self, master):
self.master = master
master.title("文件处理工具")
self.label = tk.Label(master, text="选择输入目录:")
self.label.pack()
self.input_button = tk.Button(master, text="浏览", command=self.select_input)
self.input_button.pack()
self.run_button = tk.Button(master, text="运行脚本", command=self.run_script)
self.run_button.pack()
def select_input(self):
self.input_dir = filedialog.askdirectory()
print(f"Selected: {self.input_dir}")
def run_script(self):
# 在这里调用你的脚本函数
print("Running script...")
root = tk.Tk()
gui = ScriptGUI(root)
root.mainloop()
这样非技术同事也能方便地使用你的脚本。
11. 我的自动化实践心得
经过多年编写和使用自动化脚本,我总结了几个关键经验:
-
从小处着手:不要试图一次性自动化所有事情,先解决最耗时的重复性任务。
-
文档很重要:即使是自己用的脚本,也要写清楚使用方法和依赖项,三个月后你可能就记不清细节了。
-
错误处理是关键:脚本在无人值守运行时,完善的错误处理能避免很多麻烦。
-
定期维护:随着系统升级和API变化,脚本可能需要调整才能继续工作。
-
分享带来进步:把脚本分享给同事,不仅能帮助他人,还能获得改进建议。
最让我自豪的是一个文件处理脚本,原本需要3小时的手工操作,现在只需双击一下,45秒就能完成。这种效率提升的成就感,正是编程最迷人的地方之一。
