9个Python自动化办公提效脚本:从文件处理到文档自动化
面对日常工作中繁琐的文件整理、文档转换与数据清洗任务,传统手动操作极易出错且耗时。本文提供一套基于Python的办公自动化脚本合集,覆盖音视频切片、文本情感打分、按扩展名归档、图像主色提取、邮件代发、Office转PDF以及PDF批注加水印等高频场景。借助标准库与轻量级第三方组件,配合清晰的参数配置说明,帮助读者直接复用或二次开发,实现个人工作流的半自动升级。
准备工作与核心依赖
在运行以下脚本前,请确保已安装 Python 3.8+ 并配置好基础环境变量。部分功能需要额外安装外部工具或库:
- 多媒体处理:脚本1依赖
ffmpeg(已安装请确保加入系统PATH)。 - NLP与邮箱:脚本2、7分别需
pip install jieba snownlp yagmail,邮箱发送需提前开启SMTP服务并获取授权码。 - 图像处理:脚本6需
pip install Pillow。 - 文档转换:脚本8需在目标设备安装
LibreOffice(脚本内已包含macOS默认路径探测)。 - PDF编辑:脚本9需
pip install PyPDF2。
实操步骤与参数说明
第1步:长视频按固定时长切分
目的:将单个大体积视频拆分为多个等长片段,便于传输或上传。
关键参数:segment_time 设置切割间隔(单位秒),m3u8_list 与 output_video 定义索引文件与TS文件保存路径。
from subprocess import run
input_video = "test.mp4"
segment_time = 10
m3u8_list = "/path/to/playlist.m3u8"
output_video = "/path/to/video-%04d.ts"
cmd1 = [
"ffmpeg", "-i", input_video,
"-f", "segment", "-segment_time", str(segment_time),
"-segment_format", "mpegts",
"-segment_list", m3u8_list,
"-c", "copy", "-map", "0", output_video
]
run(cmd1)
# 后续合并参考:ffmpeg -allowed_extensions ALL index.m3u8 -c copy out.mp4
完成判断:执行后目录下生成对应数量的 .ts 分片与一个 .m3u8 索引文件。
第2步:基于情感色彩的评论词汇统计
目的:从用户评语中提取核心形容词,并通过阈值划分正向/负向评价数量。
入口与动作:加载待分析文本 → 停用词过滤 → 词性标注保留 'a'(形容词)/'l'(成语) → SnowNLP打分 → 累加计数。
import jieba
import jieba.posseg as psg
from snownlp import SnowNLP
words1 = "味道差,口感没有,服务态度恶劣,心情很差,不再来了"
stop_words = {",", "!", ","}
# 1. 分词与去标点
words_raw = jieba.cut(words1)
filtered_words = [w for w in words_raw if w not in stop_words]
# 2. 词性过滤保留形容词/成语
pos_pairs = [(w.word, w.flag) for w in psg.cut(words1)]
saved_pos = ['a', 'l']
target_words = [pair[0] for pair in pos_pairs if pair[1] in saved_pos]
positive = 0
negtive = 0
for word in target_words:
score = SnowNLP(word).sentiments
print(f"{word} -> {score:.4f}")
if score > 0.7:
positive += 1
else:
negtive += 1
print(f"正向评价数量: {positive} | 负向评价数量: {negtive}")
完成判断:控制台输出各词得分与最终正负向计数,阈值可根据业务反馈微调。
第3步:指定目录批量顺序重命名
目的:将文件夹内符合扩展名的文件统一命名为连续数字编号。
动作:遍历目录 → 匹配后缀 → 拼接新路径 → os.rename 覆盖。
import os
folder_path = "/Users/cn-xx/Downloads/invoice_folder"
ext_filter = ".pdf"
counter = 1
for name in os.listdir(folder_path):
if not name.endswith(ext_filter):
continue
old_abs = os.path.join(folder_path, name)
new_name = f"{counter}{ext_filter}"
new_abs = os.path.join(folder_path, new_name)
os.rename(old_abs, new_abs)
counter += 1
print("重命名完成,当前文件列表:", os.listdir(folder_path))
风险提示:执行前建议备份原文件夹。若文件名已存在,os.rename 会静默覆盖。
第4步:批量触发系统打印队列
目的:将文件夹下的所有PDF一键发送至本地默认打印机。
注意:本例使用 macOS/Linux 的 lpr 命令。Windows环境请替换为 ctypes.windll.shell32.ShellExecuteW(None, "open", pdf_file, "", None, 1) 或调用打印服务API。
import os
import subprocess
def batch_print(folder):
for fn in os.listdir(folder):
if fn.lower().endswith('.pdf'):
full_path = os.path.join(folder, fn)
subprocess.run(['lpr', full_path], capture_output=True)
print(f"已提交打印: {fn}")
batch_print('/Users/cn-xx/Downloads/print_queue')
第5步:按扩展名自动分类移动文件
目的:扫描根目录,将媒体、安装包、图片等分散文件归档至同级子文件夹。
修复说明:原逻辑中路径变量未传入函数导致 NameError,此处已补全参数作用域。
import os
import shutil
from queue import Queue
def classify_files(base_dir, type_map):
# 创建分类子目录
for _dest in type_map:
dest_full = os.path.join(base_dir, _dest)
os.makedirs(dest_full, exist_ok=True)
q = Queue()
for _root, _dirs, _files in os.walk(base_dir):
if not _files: continue
q.put(f"{_root}::{_files}")
break # 演示仅处理顶层,多层可去掉break
while not q.empty():
item = q.get()
dir_path, raw_files = item.split("::")
raw_files = raw_files.strip("[]").split(", ")
for fname in raw_files:
if not fname.strip(): continue
_, ext = os.path.splitext(fname)
ext_clean = ext.lstrip('.').lower()
for dest_cat, allowed_ext in type_map.items():
if ext_clean in allowed_ext:
src = os.path.join(dir_path, fname)
dst = os.path.join(base_dir, dest_cat, fname)
if os.path.exists(src):
shutil.move(src, dst)
print(f"移动: {fname} -> {dest_cat}/")
src_root = "/Users/cn-xx/Downloads/test_archive"
file_rules = {
"music": {"mp3", "wav", "flac"},
"video": {"mp4", "mkv", "avi"},
"apps": {"exe", "dmg", "apk"},
"images": {"jpg", "png", "webp"}
}
classify_files(src_root, file_rules)
第6步:提取图像高频像素并生成色板
目的:识别图片中出现最多的颜色组合,并在画布左侧绘制对应色块辅助视觉核对。
from PIL import Image
img = Image.open("test_input.jpg").convert("P", palette=Image.ADAPTIVE)
palette = img.getpalette()
# 获取颜色频次降序排列
color_counts = sorted(img.getcolors(maxcolors=9999), reverse=True)[:5]
dominant_colors = []
for count, idx in color_counts:
r, g, b = palette[idx*3 : idx*3+3]
dominant_colors.append((r, g, b))
# 在原图空白区域绘制色板
canvas = img.copy()
w, h = canvas.size
block_w, block_h = 80, h
for i, (r, g, b) in enumerate(dominant_colors):
canvas.paste((r, g, b), (i*block_w, 0, (i+1)*block_w, h))
canvas.save("result_palette.jpg")
图示核对:下方为原图与处理后色板对比结果,可直接观察色调分布是否准确反映原始画面。
第7步:配置账号自动发送带附件邮件
目的:替代手工打包附件,实现定时报表或凭证的自动投递。
关键配置:password 必须填写邮箱SMTP授权码而非登录密码;端口建议使用 465 (SSL)。
import yagmail
smtp_conn = yagmail.SMTP(
user="sender@163.com",
password="your_auth_code_here", # 填写SMTP授权码
host="smtp.163.com",
port=465
)
body_html = "<p>附件为今日自动汇总数据,请查收。</p>"
smtp_conn.send("recipient@example.com", "每日运营报表", body_html, "data_export.png")
print("邮件发送成功")
第8步:Office办公文档批量转PDF
目的:利用LibreOffice引擎无界面静默转换 .docx/.xlsx/.pptx 为标准PDF。
入口:命令行调用或封装为函数。当前版本优先适配macOS路径探测,其他系统需修改 soffice_paths。
import os
import sys
import subprocess
import platform
def office_to_pdf(input_path, output_path=None):
if not os.path.exists(input_path):
raise FileNotFoundError(f"找不到源文件: {input_path}")
_, ext = os.path.splitext(input_path)
if ext.lower() not in ['.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx']:
raise ValueError("不支持的格式")
if output_path is None:
output_path = input_path.rsplit('.', 1)[0] + '.pdf'
out_dir = os.path.dirname(os.path.abspath(output_path))
# 探测 soffice 路径
engine = ''
candidates = ['/Applications/LibreOffice.app/Contents/MacOS/soffice',
'/usr/local/bin/soffice', 'soffice']
for c in candidates:
if c in ('soffice',) or os.path.exists(c):
engine = c
break
if not engine:
raise RuntimeError("未检测到LibreOffice,请先安装。")
cmd = [engine, '--headless', '--convert-to', 'pdf',
'--outdir', out_dir, os.path.abspath(input_path)]
res = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
if res.returncode == 0:
gen_name = os.path.splitext(os.path.basename(input_path))[0] + '.pdf'
final_path = os.path.join(out_dir, gen_name)
if os.path.exists(final_path):
return final_path
raise RuntimeError("转换失败,请检查日志。")
# 用法示例:office_to_pdf('report.xlsx', 'report_final.pdf')
第9步:逐页批量添加水印背景
目的:将单页透明/半透明水印PDF叠加至任意多页合同的每一页背面。
from PyPDF2 import PdfReader, PdfWriter
def add_watermark(pdf_src, wm_path, pdf_dst):
reader = PdfReader(pdf_src)
wm_reader = PdfReader(wm_path)
writer = PdfWriter()
for page in reader.pages:
page.merge_page(wm_reader.pages[0])
writer.add_page(page)
with open(pdf_dst, "wb") as f:
writer.write(f)
add_watermark("contract_original.pdf", "watermark_bg.pdf", "contract_watermarked.pdf")
print("加水印完成")
图示核对:以下为纯水印底稿与最终渲染效果的直观对比。
常见问题排查
- 权限拒绝/路径不存在:检查Python进程是否具备读写目标磁盘的权限,相对路径建议先通过
os.path.abspath()转为绝对路径。 - 编码乱码:涉及中文路径或文本时,确保终端与IDE均使用
UTF-8编码,必要时在文件头声明# -*- coding: utf-8 -*-。 - LibreOffice 静默启动慢:首次调用会自动初始化缓存,耗时约3~5秒属正常现象,后续调用将显著加快。
- 水印位置偏移:PyPDF2 的
merge_page默认左上对齐。若需精确居中,需结合Pillow预先合成带定位坐标的水印页后再传入。
简要总结
上述9个脚本覆盖了办公场景中最耗时的文件规整、格式互转、内容校验与通信分发环节。将代码中的硬编码路径替换为动态获取的命令行参数或GUI选择器,即可将其转化为稳定运行的个人效率工具集。以上就是基于Python实现自动化办公提效脚本的详细内容,更多关于Python文件批量处理、办公自动化脚本开发及应用实践的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









