在日常工作与学习中,我们经常会遇到重复繁琐的任务,比如批量处理文件、自动整理数据、定时发送消息等。Python凭借其简洁的语法和丰富的第三方库,成为实现自动化的绝佳工具。本文将分享5个高频实用的Python自动化脚本,涵盖文件处理、数据整理、网络请求等多个场景,你可以直接复用或根据需求微调,轻松提升工作效率。

一、批量文件重命名脚本

1. 功能介绍

批量将指定文件夹内的文件按照“前缀+序号”的格式重命名,支持过滤特定后缀的文件(如只重命名.jpg、.txt文件),适用于照片整理、文档分类等场景。

2. 实现代码

import os

def batch_rename_files(folder_path, prefix, file_suffix=None, start_num=1):
    """
    批量重命名文件
    :param folder_path: 文件夹路径
    :param prefix: 重命名后的前缀
    :param file_suffix: 需过滤的文件后缀(如'.jpg'),None则匹配所有文件
    :param start_num: 序号起始值
    """
    # 检查文件夹路径是否存在
    if not os.path.exists(folder_path):
        print(f"错误:文件夹路径 '{folder_path}' 不存在")
        return
    # 遍历文件夹内的文件
    for file_name in os.listdir(folder_path):
        # 跳过子文件夹,只处理文件
        file_path = os.path.join(folder_path, file_name)
        if os.path.isfile(file_path):
            # 过滤指定后缀的文件
            if file_suffix is None or file_name.endswith(file_suffix):
                # 获取文件后缀
                suffix = os.path.splitext(file_name)[1]
                # 构建新文件名
                new_file_name = f"{prefix}_{start_num}{suffix}"
                new_file_path = os.path.join(folder_path, new_file_name)
                # 重命名文件
                os.rename(file_path, new_file_path)
                print(f"已重命名:{file_name} -> {new_file_name}")
                start_num += 1
    print("批量重命名完成!")

# 示例:将./photos文件夹内的.jpg文件重命名为"旅行_1.jpg"、"旅行_2.jpg"...
if __name__ == "__main__":
    batch_rename_files(
        folder_path="./photos",
        prefix="旅行",
        file_suffix=".jpg",
        start_num=1
    )

3. 使用说明

1. 修改folder_path为目标文件夹路径(相对路径或绝对路径均可);2. 设置prefix为自定义前缀;3. 若需过滤文件类型,指定file_suffix(如.txt.png),不指定则重命名文件夹内所有文件;4. 运行脚本即可完成批量重命名。

二、Excel数据批量整理脚本

1. 功能介绍

自动读取多个Excel文件中的指定sheet,合并数据并去重,筛选出符合条件的数据(如某列值大于指定阈值),最终保存为新的Excel文件。适用于报表合并、数据统计等场景,依赖pandas库。

2. 实现代码

import pandas as pd
import os

def batch_process_excel(source_folder, target_file, sheet_name="Sheet1", filter_col=None, filter_threshold=None):
    """
    批量处理Excel数据:合并、去重、筛选
    :param source_folder: 源Excel文件所在文件夹
    :param target_file: 输出的目标Excel文件路径
    :param sheet_name: 需读取的sheet名称
    :param filter_col: 筛选列名(None则不筛选)
    :param filter_threshold: 筛选阈值(filter_col不为None时生效)
    """
    # 存储所有读取的数据
    all_data = []
    # 遍历文件夹内的Excel文件
    for file_name in os.listdir(source_folder):
        if file_name.endswith((".xlsx", ".xls")):
            file_path = os.path.join(source_folder, file_name)
            try:
                # 读取指定sheet的数据
                df = pd.read_excel(file_path, sheet_name=sheet_name)
                # 添加来源文件名列(可选)
                df["来源文件"] = file_name
                all_data.append(df)
                print(f"已读取:{file_name}")
            except Exception as e:
                print(f"读取{file_name}失败:{str(e)}")
    # 合并所有数据
    if not all_data:
        print("错误:未找到可读取的Excel文件")
        return
    merged_df = pd.concat(all_data, ignore_index=True)
    # 去重(根据所有列去重,可根据需求调整subset参数)
    merged_df = merged_df.drop_duplicates()
    # 数据筛选
    if filter_col and filter_threshold is not None:
        if filter_col in merged_df.columns:
            merged_df = merged_df[merged_df[filter_col] > filter_threshold]
            print(f"已筛选出{filter_col}大于{filter_threshold}的数据")
        else:
            print(f"警告:筛选列'{filter_col}'不存在,跳过筛选")
    # 保存到目标Excel文件
    merged_df.to_excel(target_file, index=False)
    print(f"数据处理完成!已保存到:{target_file}")
    print(f"最终数据行数:{len(merged_df)}")

# 示例:合并./excel_files文件夹内所有Excel的Sheet1,筛选出"销售额"大于1000的数据,保存到./合并结果.xlsx
if __name__ == "__main__":
    # 安装依赖:pip install pandas openpyxl(openpyxl用于读写xlsx文件)
    batch_process_excel(
        source_folder="./excel_files",
        target_file="./合并结果.xlsx",
        sheet_name="Sheet1",
        filter_col="销售额",
        filter_threshold=1000
    )

3. 使用说明

1. 先安装依赖:pip install pandas openpyxl;2. 将需要合并的Excel文件放入source_folder指定的文件夹;3. 设置target_file为输出文件路径;4. 若需筛选数据,指定filter_col(列名)和filter_threshold(阈值),不筛选则设为None;5. 运行脚本即可完成数据合并与整理。

三、定时发送邮件脚本

1. 功能介绍

自动发送邮件,支持添加文本内容、附件,可设置定时发送(如每天固定时间发送)。适用于工作汇报、定时提醒等场景,使用Python内置的smtplibemail库,支持QQ邮箱、163邮箱等。

2. 实现代码

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import time
from datetime import datetime

def send_email(sender, sender_pwd, receiver, subject, content, attachment_path=None, smtp_server="smtp.qq.com", smtp_port=465):
    """
    发送邮件(支持附件)
    :param sender: 发件人邮箱
    :param sender_pwd: 发件人邮箱授权码(非登录密码)
    :param receiver: 收件人邮箱(可多个,用列表表示)
    :param subject: 邮件主题
    :param content: 邮件正文(支持HTML格式)
    :param attachment_path: 附件路径(None则无附件)
    :param smtp_server: SMTP服务器地址
    :param smtp_port: SMTP服务器端口
    """
    # 构建邮件对象
    msg = MIMEMultipart()
    msg["From"] = Header(sender, "utf-8")
    msg["To"] = Header(",".join(receiver), "utf-8") if isinstance(receiver, list) else Header(receiver, "utf-8")
    msg["Subject"] = Header(subject, "utf-8")
    # 添加邮件正文
    msg.attach(MIMEText(content, "html", "utf-8"))
    # 添加附件
    if attachment_path and os.path.exists(attachment_path):
        with open(attachment_path, "rb") as f:
            attachment = MIMEText(f.read(), "base64", "utf-8")
            attachment["Content-Type"] = "application/octet-stream"
            # 附件文件名
            file_name = os.path.basename(attachment_path)
            attachment["Content-Disposition"] = f'attachment; filename="{file_name}"'
            msg.attach(attachment)
            print(f"已添加附件:{file_name}")
    # 发送邮件
    try:
        with smtplib.SMTP_SSL(smtp_server, smtp_port) as server:
            server.login(sender, sender_pwd)
            server.sendmail(sender, receiver, msg.as_string())
        print(f"邮件发送成功!发送时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    except Exception as e:
        print(f"邮件发送失败:{str(e)}")

def timed_send_email(hour, minute, *args, **kwargs):
    """
    定时发送邮件
    :param hour: 定时小时(24小时制)
    :param minute: 定时分钟
    :param args: send_email的位置参数
    :param kwargs: send_email的关键字参数
    """
    while True:
        now = datetime.now()
        # 判断是否到达指定时间
        if now.hour == hour and now.minute == minute:
            send_email(*args, **kwargs)
            # 发送完成后,等待24小时再继续检测(避免重复发送)
            time.sleep(24 * 60 * 60)
        # 每分钟检测一次
        time.sleep(60)

# 示例:每天18:00发送邮件,附带工作汇报附件
if __name__ == "__main__":
    # 注意:发件人邮箱需开启SMTP服务,获取授权码(如QQ邮箱在设置-账户中开启)
    sender_info = {
        "sender": "your_email@qq.com",
        "sender_pwd": "your_auth_code",  # 授权码而非登录密码
        "receiver": ["receiver1@xxx.com", "receiver2@xxx.com"],
        "subject": "每日工作汇报",
        "content": "<p>各位领导、同事:</p><p>以下是今日工作汇报,请查收。</p>",
        "attachment_path": "./每日工作汇报.docx",
        "smtp_server": "smtp.qq.com",  # QQ邮箱SMTP服务器
        "smtp_port": 465
    }
    # 每天18:00发送
    timed_send_email(hour=18, minute=0, **sender_info)

3. 使用说明

1. 发件人邮箱需开启SMTP服务(如QQ邮箱在“设置-账户”中开启),获取授权码(替代登录密码);2. 修改sender_info中的发件人、收件人、邮件主题、正文等信息;3. 若需添加附件,指定attachment_path;4. 设置timed_send_emailhourminute为定时时间;5. 运行脚本,保持脚本运行状态即可实现定时发送。

四、网页内容爬取与保存脚本

1. 功能介绍

爬取指定网页的文本内容(如新闻、博客),自动去除多余空格和标签,保存为本地txt文件。支持批量爬取多个网页,依赖requestsBeautifulSoup库,适用于资料收集、内容备份等场景。

2. 实现代码

import requests
from bs4 import BeautifulSoup
import os

def crawl_web_content(url_list, save_folder="./爬取内容"):
    """
    批量爬取网页内容并保存为txt文件
    :param url_list: 网页URL列表
    :param save_folder: 保存文件夹路径
    """
    # 创建保存文件夹
    if not os.path.exists(save_folder):
        os.makedirs(save_folder)
    # 模拟浏览器请求头(避免被反爬)
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    }
    for idx, url in enumerate(url_list, start=1):
        try:
            # 发送请求获取网页内容
            response = requests.get(url, headers=headers, timeout=10)
            response.raise_for_status()  # 抛出HTTP错误
            response.encoding = response.apparent_encoding  # 自动识别编码
            # 解析网页内容,提取文本
            soup = BeautifulSoup(response.text, "html.parser")
            # 去除script、style标签
            for script in soup(["script", "style"]):
                script.decompose()
            # 获取文本内容,去除多余空格
            text_content = soup.get_text(strip=True, separator="\n")
            # 构建保存文件名
            file_name = f"网页内容_{idx}.txt"
            file_path = os.path.join(save_folder, file_name)
            # 保存到txt文件
            with open(file_path, "w", encoding="utf-8") as f:
                f.write(f"网页URL:{url}\n")
                f.write("-" * 50 + "\n")
                f.write(text_content)
            print(f"爬取成功:{url} -> 保存为 {file_name}")
        except Exception as e:
            print(f"爬取{url}失败:{str(e)}")
    print("批量爬取完成!")

# 示例:爬取3个指定网页的内容
if __name__ == "__main__":
    # 安装依赖:pip install requests beautifulsoup4
    target_urls = [
        "https://www.example.com/article1",
        "https://www.example.com/article2",
        "https://www.example.com/article3"
    ]
    crawl_web_content(url_list=target_urls, save_folder="./网页资料")

3. 使用说明

1. 安装依赖:pip install requests beautifulsoup4;2. 将需要爬取的网页URL放入target_urls列表;3. 设置save_folder为保存文件夹路径;4. 运行脚本即可批量爬取内容并保存为txt文件。注意:爬取前请遵守目标网站的robots协议,避免过度爬取。

五、文件夹自动备份脚本

1. 功能介绍

import zipfile
import os
import time
from datetime import datetime, timedelta

def backup_folder(source_folder, backup_path, keep_days=7):
    """
    文件夹备份:打包为zip,删除旧备份
    :param source_folder: 需要备份的源文件夹
    :param backup_path: 备份文件保存路径
    :param keep_days: 保留备份的天数,超过则删除
    """
    # 检查源文件夹是否存在
    if not os.path.exists(source_folder):
        print(f"错误:源文件夹 '{source_folder}' 不存在")
        return
    # 创建备份路径(若不存在)
    if not os.path.exists(backup_path):
        os.makedirs(backup_path)
    # 构建备份文件名(包含时间戳,避免重复)
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    folder_name = os.path.basename(source_folder)
    backup_filename = f"{folder_name}_backup_{timestamp}.zip"
    backup_filepath = os.path.join(backup_path, backup_filename)
    # 打包文件夹为zip
    try:
        with zipfile.ZipFile(backup_filepath, "w", zipfile.ZIP_DEFLATED) as zipf:
            # 遍历源文件夹内的所有文件和子文件夹
            for root, dirs, files in os.walk(source_folder):
                for file in files:
                    file_path = os.path.join(root, file)
                    # 计算文件在zip中的相对路径(避免包含完整源路径)
                    arcname = os.path.relpath(file_path, source_folder)
                    zipf.write(file_path, arcname=arcname)
        print(f"备份成功:{source_folder} -> {backup_filename}")
    except Exception as e:
        print(f"备份失败:{str(e)}")
        return
    # 删除超过keep_days天的旧备份
    now = datetime.now()
    for file_name in os.listdir(backup_path):
        if file_name.startswith(f"{folder_name}_backup_") and file_name.endswith(".zip"):
            file_path = os.path.join(backup_path, file_name)
            # 获取文件创建时间
            create_time = datetime.fromtimestamp(os.path.getctime(file_path))
            # 计算时间差
            time_diff = now - create_time
            if time_diff > timedelta(days=keep_days):
                os.remove(file_path)
                print(f"已删除旧备份:{file_name}(创建时间:{create_time.strftime('%Y-%m-%d %H:%M:%S')})")
    print("备份清理完成!")

# 示例:备份./important_files文件夹到./backups,保留7天备份
if __name__ == "__main__":
    backup_folder(
        source_folder="./important_files",
        backup_path="./backups",
        keep_days=7
    )
    # 若需定时备份,可结合定时任务工具(如Windows任务计划程序、Linux crontab)
    

自动将指定文件夹打包为zip压缩包,备份到目标路径(支持本地路径或网络共享路径),并删除超过指定天数的旧备份文件,避免占用过多存储空间。适用于重要文件的定期备份场景。

2. 实现代码


3. 使用说明

1. 修改source_folder为需要备份的文件夹路径;2. 设置backup_path为备份文件保存路径;3. 调整keep_days为保留备份的天数(默认7天);4. 运行脚本即可完成备份。若需定期自动备份,可配合系统定时任务工具(Windows任务计划程序、Linux crontab)设置定时运行脚本。

总结

以上5个Python自动化脚本覆盖了文件处理、数据整理、邮件发送、网页爬取和文件夹备份等常见场景,代码简洁易懂且可灵活调整。通过自动化这些重复任务,能够大幅节省时间和精力。在使用过程中,可根据实际需求修改脚本参数,或扩展功能(如添加日志记录、异常报警等)。如果需要其他场景的自动化脚本,也可以基于Python的相关库进行开发。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐