10个超实用Python自动化脚本,让你工作效率提升10倍!

前言

作为一名程序员或运维工程师,日常工作中总有许多重复性的任务让人头疼。Python 凭借其简洁的语法和丰富的第三方库,成为编写自动化脚本的首选语言。本文整理了10个超实用的 Python 脚本,涵盖文件处理、数据分析、网络请求、办公自动化等场景,每个脚本都能直接运行,帮你节省大量时间。

1. 批量重命名文件脚本

面对文件夹中成百上千个命名混乱的文件,手动修改几乎不可能。这个脚本可以批量添加前缀、替换关键词,或按序号重命名。

import os

def batch_rename(folder_path, old_str, new_str):
    """批量替换文件名中的指定字符串"""
    count = 0
    for filename in os.listdir(folder_path):
        if old_str in filename:
            old_path = os.path.join(folder_path, filename)
            new_filename = filename.replace(old_str, new_str)
            new_path = os.path.join(folder_path, new_filename)
            os.rename(old_path, new_path)
            count += 1
            print(f"重命名: {filename} -> {new_filename}")
    print(f"共重命名 {count} 个文件")

# 用法示例:将当前目录下所有文件名中的 '副本' 替换为 'backup'
batch_rename('./', '副本', 'backup')

2. 图片批量压缩脚本

博客配图、网站图片需要在保证质量的前提下尽量压缩体积。使用 Pillow 库可以批量压缩图片。

from PIL import Image
import os

def compress_images(input_dir, output_dir, quality=75):
    """批量压缩图片,quality=75 为推荐值"""
    os.makedirs(output_dir, exist_ok=True)
    for filename in os.listdir(input_dir):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.webp')):
            img_path = os.path.join(input_dir, filename)
            img = Image.open(img_path)
            # 转为RGB(处理RGBA格式的PNG)
            if img.mode in ('RGBA', 'P'):
                img = img.convert('RGB')
            output_path = os.path.join(output_dir, filename)
            img.save(output_path, 'JPEG', quality=quality, optimize=True)
            orig_size = os.path.getsize(img_path) // 1024
            new_size = os.path.getsize(output_path) // 1024
            print(f"{filename}: {orig_size}KB -> {new_size}KB (压缩率: {new_size/orig_size*100:.1f}%)")

compress_images('./images', './images_compressed', quality=70)

3. PDF 合并与拆分脚本

处理 PDF 文件是办公自动化中的常见需求,PyPDF2 库可以轻松实现合并和拆分。

from PyPDF2 import PdfMerger, PdfReader, PdfWriter

# 合并多个PDF
def merge_pdfs(pdf_list, output_path):
    merger = PdfMerger()
    for pdf in pdf_list:
        merger.append(pdf)
    merger.write(output_path)
    merger.close()
    print(f"已合并 {len(pdf_list)} 个PDF -> {output_path}")

merge_pdfs(['doc1.pdf', 'doc2.pdf', 'doc3.pdf'], 'merged.pdf')

# 拆分PDF(按页码范围)
def split_pdf(input_path, start_page, end_page, output_path):
    reader = PdfReader(input_path)
    writer = PdfWriter()
    for i in range(start_page - 1, min(end_page, len(reader.pages))):
        writer.add_page(reader.pages[i])
    with open(output_path, 'wb') as f:
        writer.write(f)
    print(f"已拆分第 {start_page}-{end_page} 页 -> {output_path}")

split_pdf('merged.pdf', 1, 5, 'part1.pdf')

4. 网页内容爬取脚本

使用 requests + BeautifulSoup 快速抓取网页内容,是数据分析的第一步。

import requests
from bs4 import BeautifulSoup
import csv

def scrape_news(url, output_csv):
    """爬取新闻标题和链接,保存到CSV"""
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)'}
    resp = requests.get(url, headers=headers, timeout=10)
    resp.encoding = resp.apparent_encoding
    soup = BeautifulSoup(resp.text, 'html.parser')
    
    results = []
    # 以H3标签为例,实际根据目标网站调整选择器
    for item in soup.select('h3 a'):
        title = item.get_text(strip=True)
        link = item.get('href', '')
        if link and not link.startswith('http'):
            link = url.rstrip('/') + '/' + link.lstrip('/')
        results.append({'title': title, 'link': link})
    
    with open(output_csv, 'w', newline='', encoding='utf-8-sig') as f:
        writer = csv.DictWriter(f, fieldnames=['title', 'link'])
        writer.writeheader()
        writer.writerows(results)
    print(f"已保存 {len(results)} 条数据 -> {output_csv}")

# scrape_news('https://example.com/news', 'news.csv')
print("请替换目标URL后取消注释运行")

5. Excel/CSV 批量处理脚本

处理 Excel 报表是很多人的日常痛点,pandas 让这一切变得简单。

import pandas as pd
import glob

def process_excel_folder(folder_path, output_file):
    """合并文件夹中所有Excel文件,按指定列汇总"""
    all_data = []
    for file in glob.glob(f"{folder_path}/*.xlsx"):
        df = pd.read_excel(file)
        df['source_file'] = os.path.basename(file)
        all_data.append(df)
        print(f"已读取: {file} ({len(df)} 行)")
    
    merged = pd.concat(all_data, ignore_index=True)
    print(f"合并后共 {len(merged)} 行")
    
    # 示例:按 '部门' 列分组求和(根据实际列名调整)
    if '销售额' in merged.columns and '部门' in merged.columns:
        summary = merged.groupby('部门')['销售额'].sum().reset_index()
        summary.to_excel('部门汇总.xlsx', index=False)
        print("已生成部门汇总.xlsx")
    
    merged.to_excel(output_file, index=False)
    print(f"已保存合并结果 -> {output_file}")

# process_excel_folder('./reports', 'all_reports.xlsx')

6. 自动整理文件脚本

下载文件夹总是乱七八糟?这个脚本按文件类型自动分类整理。

import os
import shutil
from pathlib import Path

def organize_files(folder_path):
    """按文件扩展名分类整理文件"""
    extensions_map = {
        '图片': ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg'],
        '文档': ['.pdf', '.docx', '.doc', '.txt', '.md', '.pptx', '.xlsx'],
        '压缩包': ['.zip', '.rar', '.7z', '.tar', '.gz'],
        '视频': ['.mp4', '.avi', '.mov', '.mkv', '.flv'],
        '音频': ['.mp3', '.wav', '.flac', '.aac'],
        '代码': ['.py', '.js', '.html', '.css', '.json', '.xml'],
    }
    
    for file in os.listdir(folder_path):
        file_path = os.path.join(folder_path, file)
        if os.path.isfile(file_path):
            ext = os.path.splitext(file)[1].lower()
            target_folder = '其他'
            for folder, exts in extensions_map.items():
                if ext in exts:
                    target_folder = folder
                    break
            target_path = os.path.join(folder_path, target_folder)
            os.makedirs(target_path, exist_ok=True)
            shutil.move(file_path, os.path.join(target_path, file))
            print(f"移动: {file} -> {target_folder}/")
    
    print("文件整理完成!")

organize_files('./downloads')

7. 定时发送邮件脚本

结合 cron 定时任务,可以实现每日自动发送报告邮件。

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import os

def send_email(smtp_server, smtp_port, sender, password, receivers, 
               subject, body, attachments=None):
    """发送带附件的邮件"""
    msg = MIMEMultipart()
    msg['From'] = sender
    msg['To'] = ', '.join(receivers)
    msg['Subject'] = subject
    msg.attach(MIMEText(body, 'plain', 'utf-8'))
    
    # 添加附件
    if attachments:
        for filepath in attachments:
            with open(filepath, 'rb') as f:
                part = MIMEBase('application', 'octet-stream')
                part.set_payload(f.read())
                encoders.encode_base64(part)
                part.add_header('Content-Disposition', 
                               f'attachment; filename="{os.path.basename(filepath)}"')
                msg.attach(part)
    
    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.starttls()
        server.login(sender, password)
        server.sendmail(sender, receivers, msg.as_string())
    print(f"邮件已发送至 {receivers}")

# 用法示例(请替换为真实配置)
# send_email('smtp.qq.com', 587, 
#            'your_email@qq.com', '邮箱授权码',
#            ['receiver@example.com'],
#            '每日数据报告', '请查收附件中的数据报告',
#            attachments=['report.xlsx'])
print("请配置SMTP信息后取消注释运行")

8. 系统资源监控脚本

监控服务器 CPU、内存、磁盘使用率,超过阈值自动告警。

import psutil
import time
import smtplib
from datetime import datetime

def monitor_system(cpu_threshold=80, mem_threshold=85, disk_threshold=90):
    """监控系统资源,超阈值打印告警"""
    cpu = psutil.cpu_percent(interval=1)
    mem = psutil.virtual_memory()
    disk = psutil.disk_usage('/')
    
    report = f"""系统监控报告 [{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}]
CPU使用率: {cpu}%
内存使用率: {mem.percent}% (已用 {mem.used//1024//1024}MB / 总计 {mem.total//1024//1024}MB)
磁盘使用率: {disk.percent}% (已用 {disk.used//1024//1024//1024}GB / 总计 {disk.total//1024//1024//1024}GB)
"""
    print(report)
    
    alerts = []
    if cpu > cpu_threshold:
        alerts.append(f"⚠️ CPU使用率超标: {cpu}% > {cpu_threshold}%")
    if mem.percent > mem_threshold:
        alerts.append(f"⚠️ 内存使用率超标: {mem.percent}% > {mem_threshold}%")
    if disk.percent > disk_threshold:
        alerts.append(f"⚠️ 磁盘使用率超标: {disk.percent}% > {disk_threshold}%")
    
    if alerts:
        print("告警信息:")
        for alert in alerts:
            print(alert)
    else:
        print("✅ 所有指标正常")
    
    return alerts

# 每60秒监控一次,持续运行
if __name__ == '__main__':
    while True:
        monitor_system()
        time.sleep(60)

9. 二维码生成与识别脚本

生成二维码用于分享链接,或识别图片中的二维码内容。

import qrcode
from PIL import Image
from pyzbar.pyzbar import decode

def generate_qr(data, output_path, logo_path=None):
    """生成二维码,可选添加中心Logo"""
    qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_H,
                       box_size=10, border=4)
    qr.add_data(data)
    qr.make(fit=True)
    img = qr.make_image(fill_color='black', back_color='white').convert('RGB')
    
    # 添加Logo
    if logo_path and os.path.exists(logo_path):
        logo = Image.open(logo_path)
        qr_size = img.size[0]
        logo_size = qr_size // 5
        logo = logo.resize((logo_size, logo_size))
        pos = ((qr_size - logo_size) // 2, (qr_size - logo_size) // 2)
        img.paste(logo, pos)
    
    img.save(output_path)
    print(f"二维码已保存 -> {output_path}")

def decode_qr(image_path):
    """识别图片中的二维码"""
    img = Image.open(image_path)
    results = decode(img)
    for result in results:
        print(f"类型: {result.type}, 内容: {result.data.decode('utf-8')}")
    return [r.data.decode('utf-8') for r in results]

# 生成二维码示例
generate_qr('https://xjahb.cn', 'site_qr.png')

# 识别二维码示例
# decode_qr('site_qr.png')

10. 日志文件分析脚本

分析 Nginx/应用日志,统计访问量、错误率等关键指标。

import re
from collections import Counter
from datetime import datetime

def analyze_nginx_log(log_path, top_n=10):
    """分析Nginx访问日志"""
    ip_counter = Counter()
    url_counter = Counter()
    status_counter = Counter()
    total = 0
    
    # Nginx默认日志格式正则
    log_pattern = re.compile(
        r'(?P\d+\.\d+\.\d+\.\d+).*?\[(?P

总结

以上10个 Python 脚本涵盖了日常工作中最常见的自动化场景。建议将每个脚本保存为独立文件,并根据实际需求调整参数。配合 Linux crontab 或 Windows 任务计划程序,可以实现完全无人值守的自动化工作流。

温馨提示:运行前请使用 pip 安装所需第三方库:
pip install Pillow PyPDF2 requests beautifulsoup4 pandas openpyxl psutil qrcode pyzbar

你有哪些重复性工作最希望自动化?欢迎在评论区分享,说不定下期就帮你写出来!

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容