8 个实用的 Python 自动化办公脚本示例
在日常工作中,我们经常需要执行大量重复性任务,例如阅读新闻、发送邮件、整理文件等。使用自动化脚本可以显著减少手动操作,提高效率。Python 因其丰富的库支持和简洁的语法,成为实现自动化的首选语言。
本文整理了 8 个经典的 Python 自动化脚本案例,涵盖文本处理、数据探索、邮件服务、多媒体转换及系统管理等场景。每个脚本均经过代码修正与逻辑完善,并补充了环境配置与安全注意事项。
Python 自动化脚本可显著减少重复劳动。本文整理了 8 个实用案例,包括网页新闻朗读、数据探索、批量邮件发送、PDF 转音频、随机音乐播放、天气信息获取、长网址缩短及下载文件夹清理。每个脚本均提供完整代码与依赖说明,重点修复了原代码中的逻辑错误与安全漏洞(如硬编码密码)。文章还补充了环境配置、异常处理及最佳实践建议,帮助开发者快速搭建自动化工作流并安全部署。

在日常工作中,我们经常需要执行大量重复性任务,例如阅读新闻、发送邮件、整理文件等。使用自动化脚本可以显著减少手动操作,提高效率。Python 因其丰富的库支持和简洁的语法,成为实现自动化的首选语言。
本文整理了 8 个经典的 Python 自动化脚本案例,涵盖文本处理、数据探索、邮件服务、多媒体转换及系统管理等场景。每个脚本均经过代码修正与逻辑完善,并补充了环境配置与安全注意事项。
在运行以下脚本前,请确保已安装 Python 3.6+ 环境,并通过 pip 安装所需依赖:
pip install requests beautifulsoup4 pyttsx3 dtale pandas PyPDF2 seaborn
注意:部分脚本涉及网络请求或系统文件操作,请在受控环境中测试,避免误删重要数据。
该脚本通过爬虫抓取网页文本,并利用语音合成引擎朗读内容。适合听力障碍用户或希望'听'新闻的场景。
核心逻辑:
requests 获取网页 HTML。BeautifulSoup 解析特定标签(如 .p)提取正文。pyttsx3 将文本转换为语音播放。代码示例:
import pyttsx3
import requests
from bs4 import BeautifulSoup
def setup_voice():
engine = pyttsx3.init('sapi5')
voices = engine.getProperty('voices')
# 设置语速和语音 ID,可根据系统调整
engine.setProperty('rate', 130)
if voices:
engine.setProperty('voice', voices[1].id)
return engine
def speak(engine, audio):
engine.say(audio)
engine.runAndWait()
def main():
url = input("请输入新闻网页 URL: ")
try:
res = requests.get(url, timeout=10)
res.raise_for_status()
soup = BeautifulSoup(res.text, 'html.parser')
articles = []
# 尝试提取多个段落
for p in soup.select('.p')[:5]:
text = p.get_text(strip=True)
if text:
articles.append(text)
full_text = " ".join(articles)
if not full_text:
print("未找到有效文本")
return
engine = setup_voice()
speak(engine, full_text)
except Exception as e:
print(f"发生错误:{e}")
if __name__ == '__main__':
main()
数据探索是数据分析的第一步。Dtale 是一个基于 Web 的数据分析工具,可快速生成 Pandas DataFrame 的可视化报告。
特点:
代码示例:
import seaborn as sns
import dtale
# 加载内置数据集
df = sns.load_dataset('titanic')
# 启动 Dtale 浏览器窗口
dtale.show(df)
提示:运行后会自动打开浏览器,无需额外配置 Flask 后端。
此脚本用于批量定时发送邮件,支持自定义主题和内容。相比传统客户端,Python 脚本更易于集成到工作流中。
安全警告:切勿在代码中硬编码邮箱密码,建议使用环境变量或配置文件管理敏感信息。
代码示例:
import smtplib
from email.message import EmailMessage
import os
import pandas as pd
def send_email(recipient, subject, content, sender_addr, sender_pass):
msg = EmailMessage()
msg['From'] = sender_addr
msg['To'] = recipient
msg['Subject'] = subject
msg.set_content(content)
try:
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
smtp.login(sender_addr, sender_pass)
smtp.send_message(msg)
print(f"邮件已发送至:{recipient}")
except Exception as e:
print(f"发送失败:{e}")
if __name__ == '__main__':
# 读取联系人列表 (Excel 格式:邮箱,主题,内容)
df = pd.read_excel('contacts.xlsx')
# 从环境变量获取凭据,避免硬编码
sender = os.getenv('EMAIL_USER')
password = os.getenv('EMAIL_PASS')
if not sender or not password:
raise ValueError("请设置 EMAIL_USER 和 EMAIL_PASS 环境变量")
for _, row in df.iterrows():
send_email(row[0], row[1], row[2], sender, password)
利用 PyPDF2 提取 PDF 文本,再通过 pyttsx3 生成 MP3 文件。适用于制作有声读物或辅助阅读。
代码示例:
import pyttsx3
import PyPDF2
import os
def pdf_to_audio(pdf_path, output_mp3):
if not os.path.exists(pdf_path):
print("文件不存在")
return
reader = PyPDF2.PdfReader(open(pdf_path, 'rb'))
speaker = pyttsx3.init()
all_text = ""
for page_num in range(len(reader.pages)):
text = reader.pages[page_num].extract_text()
if text:
cleaned = text.strip().replace('\n', ' ')
all_text += cleaned + "\n"
speaker.save_to_file(all_text, output_mp3)
speaker.runAndWait()
print(f"音频已保存至:{output_mp3}")
if __name__ == '__main__':
pdf_to_audio('story.pdf', 'story.mp3')
从指定文件夹中随机选择一首歌曲播放。注意 os.startfile 仅支持 Windows 系统。
代码示例:
import random
import os
def play_random_music(music_dir):
if not os.path.isdir(music_dir):
print("目录无效")
return
songs = [f for f in os.listdir(music_dir) if f.endswith(('.mp3', '.wav'))]
if not songs:
print("未找到音频文件")
return
song = random.choice(songs)
print(f"正在播放:{song}")
# Windows 系统专用
if os.name == 'nt':
os.startfile(os.path.join(music_dir, song))
else:
# Linux/Mac 可使用 open 命令替代
os.system(f'xdg-open {os.path.join(music_dir, song)}')
if __name__ == '__main__':
play_random_music(r'G:\new english songs')
调用气象局 API 获取天气数据。API 地址可能随时间变更,建议查阅最新文档。
代码示例:
import requests
import json
import logging
logging.basicConfig(level=logging.ERROR)
def get_weather_info(city_code):
url_city = f'http://www.weather.com.cn/data/cityinfo/{city_code}.html'
url_wind = f'http://www.weather.com.cn/data/sk/{city_code}.html'
try:
r_city = requests.get(url_city, timeout=5)
r_wind = requests.get(url_wind, timeout=5)
if r_city.status_code != 200 or r_wind.status_code != 200:
logging.error("无法获取天气数据")
return None
info_city = json.loads(r_city.content.decode())
info_wind = json.loads(r_wind.content.decode())
data = info_city['weatherinfo']
wind_data = info_wind['weatherinfo']
return {
'city': data['city'],
'temp': f"{data['temp1']}~{data['temp2']}",
'weather': data['weather'],
'wind': f"{wind_data['WD']}({wind_data['WS']})"
}
except Exception as e:
logging.error(e)
return None
if __name__ == '__main__':
result = get_weather_info('101021200') # 示例城市代码
if result:
print(f"{result['city']} {result['weather']} {result['temp']} {result['wind']}")
将冗长的 URL 转换为短链接,便于分享。使用 TinyURL 公开 API。
代码示例:
import urllib.request
import urllib.parse
def make_tiny(url):
request_url = f'http://tinyurl.com/api-create.php?url={urllib.parse.quote(url)}'
try:
response = urllib.request.urlopen(request_url)
return response.read().decode('utf-8')
except Exception as e:
return f"Error: {e}"
if __name__ == '__main__':
long_url = input("请输入长链接:")
short_url = make_tiny(long_url)
print(f"短链接:{short_url}")
根据文件大小限制自动清理旧文件。为防止误删,默认仅打印日志,需手动开启删除功能。
代码示例:
import os
import time
def get_file_list(file_path):
files = os.listdir(file_path)
# 按修改时间排序,最旧的在前
return sorted(files, key=lambda x: os.path.getmtime(os.path.join(file_path, x)))
def get_folder_size(file_path):
total = 0
for root, dirs, files in os.walk(file_path):
for f in files:
fp = os.path.join(root, f)
if os.path.isfile(fp):
total += os.path.getsize(fp)
return total / (1024 * 1024) # MB
def cleanup_folder(path, max_size_mb, del_threshold_mb):
current_size = get_folder_size(path)
print(f"当前大小:{current_size:.2f} MB")
if current_size > max_size_mb:
files = get_file_list(path)
deleted_count = 0
for filename in files:
if current_size <= (max_size_mb - del_threshold_mb):
break
file_path = os.path.join(path, filename)
if os.path.isfile(file_path):
size = os.path.getsize(file_path) / (1024 * 1024)
print(f"计划删除:{filename} ({size:.2f} MB)")
# 实际删除请取消下面注释
# os.remove(file_path)
# current_size -= size
deleted_count += 1
print(f"共标记 {deleted_count} 个文件待清理")
if __name__ == '__main__':
# 设置目标路径和阈值
target_dir = r'C:\Users\YourName\Downloads'
cleanup_folder(target_dir, max_size_mb=500, del_threshold_mb=100)
.env 文件或操作系统环境变量。try-except 块捕获异常,防止程序崩溃。以上 8 个脚本展示了 Python 在办公自动化领域的强大能力。通过组合这些工具,可以构建定制化的工作流。开发者应根据实际需求调整代码逻辑,并始终关注安全性与稳定性。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online