9个Python自动化办公提效脚本:从文件处理到文档自动化

方予
方予
发布时间:2026-10-10| 1人浏览过
原创

面对日常工作中繁琐的文件整理、文档转换与数据清洗任务,传统手动操作极易出错且耗时。本文提供一套基于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")

图示核对:下方为原图与处理后色板对比结果,可直接观察色调分布是否准确反映原始画面。

原图处理后的色板展示效果
处理后的图像左侧展示了提取出的5种主导色块,便于设计校对或主题提取。

第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("加水印完成")

图示核对:以下为纯水印底稿与最终渲染效果的直观对比。

用于叠加的透明背景水印底稿
作为基准的水印文件通常应为白底透明或浅灰文字,尺寸建议设置为A4比例。
PDF逐页加水印后的最终页面效果
脚本执行后生成的带水印文档,文字清晰可见且排版未发生错位。

常见问题排查

  • 权限拒绝/路径不存在:检查Python进程是否具备读写目标磁盘的权限,相对路径建议先通过 os.path.abspath() 转为绝对路径。
  • 编码乱码:涉及中文路径或文本时,确保终端与IDE均使用 UTF-8 编码,必要时在文件头声明 # -*- coding: utf-8 -*-。
  • LibreOffice 静默启动慢:首次调用会自动初始化缓存,耗时约3~5秒属正常现象,后续调用将显著加快。
  • 水印位置偏移:PyPDF2 的 merge_page 默认左上对齐。若需精确居中,需结合 Pillow 预先合成带定位坐标的水印页后再传入。

简要总结

上述9个脚本覆盖了办公场景中最耗时的文件规整、格式互转、内容校验与通信分发环节。将代码中的硬编码路径替换为动态获取的命令行参数或GUI选择器,即可将其转化为稳定运行的个人效率工具集。以上就是基于Python实现自动化办公提效脚本的详细内容,更多关于Python文件批量处理、办公自动化脚本开发及应用实践的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。