news 2026/10/1 4:03:47

Python自动化办公实战:10个脚本搞定文件、Excel、PDF与邮件处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python自动化办公实战:10个脚本搞定文件、Excel、PDF与邮件处理

算下来,我写脚本省下的时间早就超过了学 Python 花的时间。办公室里最磨人的从来不是高难度的活,而是那种重复、琐碎、一不留神就出错的操作:把一个表格里几百行数据搬到另一个表、把几十个文件按规则重命名、把每月报表从系统导出再填进固定模板。Python 自动化办公之所以值得认真搞一遍,就是因为它能把这堆“用双手当复制粘贴机器”的工作变成几段十几行的代码。这篇文章要分享的是我在实际工作里整理并长期维护的 10 个 Python 脚本,覆盖文件管理、Excel 处理、Word/PDF 生成、邮件发送、定时任务这些频率最高的场景。每个脚本我都会给出能直接跑的代码、需要改的参数,以及真实使用中踩过的坑,适合财务、行政、运营、数据分析这类每天和表格文档打交道的岗位,也适合刚学 Python 想找项目练手的朋友。

1. 为什么我坚持用 Python 打通这些重复的办公操作

先讲一个最常见的场景:每月 1 号,我需要把销售部、运营部、客服部发来的三个 Excel 汇总成一个总表,然后按格式清洗、填充缺失值、把日期列转成统一格式,最后给领导发邮件。这套流程手工做大概要四十分钟,期间还会出现复制错行、漏掉一列、日期格式不统一之类的问题。我用 Python 重写之后,整个流程变成双击一个脚本,喝杯水的功夫就出结果,准确率还高得多。这是我对自动化办公最直观的体会:它能消灭的不只是时间,更是那些因为重复劳动产生的低级错误。

很多人会问一个问题:Excel 本身有公式、有宏,WPS 里也有自动化工具,为什么非要 Python?我的回答是:公式和宏解决得了“表内处理”,解决不了“表与文件之间的事”。尤其当你需要把十几个 PDF 合并、从 Word 模板批量生成合同、把图片里的文字提取出来、按名单逐个发附件邮件的时候,Excel 宏很难优雅地完成,而 Python 有现成的第三方库,代码量短、逻辑直观,写一次就能反复用。

另外,Python 的门槛比想象中低。我见过不少完全没有编程基础的同事,照着网上的模板改改路径和字段名,也能把脚本跑起来。真正决定成败的不是编程技巧,而是你有没有识别出“这件事其实可以自动化”的能力。下面这 10 个脚本就是我从高频办公需求里筛出来的,每一个都对应一个非常具体的痛点场景,你可以直接按需取用。

2. 文件管理类脚本:归档、重命名、去重一次搞定

文件管理是最容易被忽略的自动化领域。很多人桌面和下载文件夹里堆了几百个文件,想整理的时候又觉得手动一个个点太费劲,结果越拖越乱。这一类脚本做的是“脏活累活”,但代码通常最简单,也最适合作为入门练习。

2.1 脚本 1:按文件类型和时间自动归档

这个脚本解决的核心问题是:下载文件夹里既有图片、又有文档、还有压缩包,日期也乱七八糟,想按自己的规则归档整理。说白了一个字“乱”。

运行时思路是遍历指定目录下的所有文件,读取扩展名和最后修改时间,然后把文件移动到对应的分类文件夹。比如图片放到“图片资料”,文档放到“文档文件”,2023 年的文件额外放进带年份的子目录,方便以后追溯。

import os import shutil from datetime import datetime def auto_archive(source_dir): # 扩展名到目标文件夹的映射关系,可以按自己习惯增删 category_map = { '.jpg': '图片资料', '.jpeg': '图片资料', '.png': '图片资料', '.gif': '图片资料', '.doc': '文档文件', '.docx': '文档文件', '.xls': '表格文件', '.xlsx': '表格文件', '.pdf': 'PDF文档', '.txt': '文本文件', '.zip': '压缩包', '.rar': '压缩包', '.7z': '压缩包', } for filename in os.listdir(source_dir): file_path = os.path.join(source_dir, filename) if not os.path.isfile(file_path): continue ext = os.path.splitext(filename)[1].lower() target_folder = category_map.get(ext, '其他文件') # 按年份再细分一层 mtime = datetime.fromtimestamp(os.path.getmtime(file_path)) year_folder = os.path.join(source_dir, target_folder, str(mtime.year)) os.makedirs(year_folder, exist_ok=True) shutil.move(file_path, os.path.join(year_folder, filename)) if __name__ == '__main__': auto_archive(r'D:\下载')

跑之前强烈建议先复制一份目录测试,或者把shutil.move改成shutil.copy试跑一次。我第一版脚本就是没注意这个问题,直接把一个还在使用的项目文件挪到了别处,后面花了不少时间才找回来。另外,mtime在有些场景下代表的是“修改时间”,如果你需要按“创建时间”归档,应该用os.path.getctime(),但这在 Windows 和 Linux 上的含义不太一样,写成跨平台脚本时要留个心眼。

2.2 脚本 2:按规则批量重命名

批量重命名是文件管理里最痛的需求。比如一批设备照片,拍摄出来叫 “IMG_001.jpg”,你需要把它改成“设备编号-日期-序号”的规范格式;再比如一批合同扫描件,需要统一在前面加日期前缀。手动一个个重命名不仅慢,还容易把序号排错。

我常用的方案是利用 Python 的os.rename循环处理,同时用正则表达式提取文件名里的关键数字。下面这段代码做的事情是:把文件夹里所有.jpg图片按照最后修改时间排序,重新命名为“2025 年设备巡检-001.jpg”这种格式。

import os from datetime import datetime def batch_rename(folder, prefix): files = [f for f in os.listdir(folder) if f.lower().endswith('.jpg')] # 按修改时间排序,保证序号稳定 files.sort(key=lambda f: os.path.getmtime(os.path.join(folder, f))) for idx, filename in enumerate(files, 1): mtime = datetime.fromtimestamp(os.path.getmtime(os.path.join(folder, filename))) new_name = f'{prefix}-{mtime.strftime("%Y%m%d")}-{idx:03d}.jpg' os.rename(os.path.join(folder, filename), os.path.join(folder, new_name)) print(f'{filename} -> {new_name}') if __name__ == '__main__': batch_rename(r'D:\设备照片', '设备巡检')

重命名的坑主要在“序号不稳定”上。很多人以为直接按文件名排序再编序号就行,实际上 Windows 资源管理器的排序规则和 Python 里字符串排序规则不完全一样,所以一定要先确定排序依据——“按修改时间”是比“按文件名字符串”更可靠的方案。另外,重命名前最好打印一下预期的新旧名字对照列表,确认无误再执行,这种谨慎能帮你躲掉绝大多数低级事故。

2.3 脚本 3:查找并清理重复文件

重复文件占空间这事,平时没人注意,等硬盘满的时候才叫难受。尤其是大家通过微信、钉钉传来传去的文件,经常同一份资料存了好几个版本,文件名后面加个(1)、(2)或者“副本”字样。清理重复文件靠肉眼识别效率太低,交给脚本按内容指纹判断才是正道。

我的做法是递归扫描目录,计算每个文件的 MD5 值,把哈希值相同的文件归为一组,然后删除多余的副本,保留最早创建的那一个。

import os import hashlib def file_md5(file_path, chunk_size=8192): md5 = hashlib.md5() with open(file_path, 'rb') as f: while chunk := f.read(chunk_size): md5.update(chunk) return md5.hexdigest() def find_duplicates(root_dir): hash_map = {} for dirpath, _, filenames in os.walk(root_dir): for name in filenames: full_path = os.path.join(dirpath, name) try: f_hash = file_md5(full_path) hash_map.setdefault(f_hash, []).append(full_path) except PermissionError: continue return {h: paths for h, paths in hash_map.items() if len(paths) > 1} if __name__ == '__main__': dups = find_duplicates(r'D:\工作资料') for h, paths in dups.items(): # 保留第一个文件,其余打印出来 keep, *rest = paths print(f'保留: {keep}') for p in rest: print(f' 可删除: {p}')

这段代码我只是打印出“可删除”的列表,没有真的删,这是有意为之。自动删除文件风险太高,万一误判,补救的机会都没有。实际操作时我会先把结果导出成文本文件,人工扫一眼再决定是否加一段os.remove()。另一个经验是:MD5 碰撞在日常办公场景里几乎不可能发生,直接用 MD5 就够,没必要上 SHA-256 增加计算时间。

3. Excel 处理类脚本:合并表格和数据清洗是高频刚需

如果你每天的工作在 Excel 里超过一小时,那么你大概率已经遇过“复制粘贴到手抽筋”的时刻。Excel 自动化处理是 Python 办公脚本里价值最高的一类,因为表格操作本身规则性强、数据量大,正是脚本最擅长的。

3.1 脚本 4:多工作簿合并成一个总表

这是所有 Excel 需求里我在实际工作中用得最多的一个。场景非常典型:每个分部门把自己报过来的表发到群里,格式还不全一样,有些有表头、有些没表头、有些中间空了两行。手工合并容易漏数据,改格式又浪费时间。

用 pandas 合并 Excel 的思路是:用pd.read_excel()读取多个文件和多个 sheet,指定统一的表头行,然后pd.concat()纵向拼接。下面这段代码把指定目录下所有.xlsx文件的第一个 sheet 合并成一个总表,并把合并结果保存成新文件。

import pandas as pd import glob def merge_excels(folder, output_file): all_files = glob.glob(folder + '/*.xlsx') df_list = [] for file in all_files: # header=0 表示第一行是表头;如果表头不在第一行,改成对应行数 df = pd.read_excel(file, header=0) df_list.append(df) merged_df = pd.concat(df_list, ignore_index=True) merged_df.to_excel(output_file, index=False) print(f'合并完成,共 {len(merged_df)} 行,生成: {output_file}') if __name__ == '__main__': merge_excels(r'D:\月度数据', r'D:\合并结果.xlsx')

看着简单,实际用起来最容易出问题的是“表头不一致”。有的部门把“姓名”写成“名字”,有的把“金额”写成“费用”,合并之后就会出现两列并存。我的建议是在合并前先检查df.columns,用df.rename(columns={'名字': '姓名', '费用': '金额'})统一字段名,再合并。还有个细节:pandas 读出来的单元格如果包含公式,默认读的是上一次计算后缓存的值,而不是公式本身,这点在财务对账时尤其要提前说明。

3.2 脚本 5:常用数据清洗与格式修正

第二个高频需求是数据清洗。原始表格里总有些让人头疼的情况:电话号码变成科学计数法、身份证号少了前导零、日期的格式五花八门、明明空格里看不见但就是匹配不上。这类问题靠 Excel 手工操作也能处理一部分,但数据量一上去,脚本的优势就特别明显。

下面这个脚本针对的是最常见的几类问题:删除完全重复的行、去掉首尾和中间多余空白字符、统一日期格式、把某些列转成指定数字类型。

import pandas as pd def clean_data(input_file, output_file): df = pd.read_excel(input_file) # 1. 删除所有列完全重复的行 df = df.drop_duplicates() # 2. 去除字符串列首尾空白,中间的连续空格也并成一个 str_cols = df.select_dtypes(include=['object']).columns for col in str_cols: df[col] = df[col].astype(str).str.strip().str.replace(r'\s+', ' ', regex=True) # 3. 日期列统一成 YYYY-MM-DD # 假设“日期”列存在,且有些单元格混了不同格式 if '日期' in df.columns: df['日期'] = pd.to_datetime(df['日期'], errors='coerce').dt.strftime('%Y-%m-%d') # 4. “金额”列强制转成浮点数,无法转换的值置为空再后续处理 if '金额' in df.columns: df['金额'] = pd.to_numeric(df['金额'], errors='coerce') df.to_excel(output_file, index=False) print(f'清洗完成,剩余 {len(df)} 行') if __name__ == '__main__': clean_data(r'D:\原始数据.xlsx', r'D:\清洗后数据.xlsx')

清洗脚本最容易被忽略的一件事是“清洗规则要反复确认”。我给财务部门做过一版清洗,当时自作主张把空值填成了 0,结果下游统计时把这批数据全部算进去了,最后做出来的月度报表差了一大截。从那以后,凡是涉及填充空值、删除行这类操作,我一律先输出一个清洗前后行数变化的对比日志,让业务方确认后再执行。另外errors='coerce'这种参数很实用,它能保证某个单元格值不符合规范时不会中断整个脚本,而是标记成缺失值,方便后续处理。

4. 文档生产类脚本:Word、PDF 的批量操作

办公自动化的另一个大方向是文档的批量生成和转换。最典型的需求就是:每个月光是生成几十份格式相同但内容不同的合同、通知、质检报告,就能耗掉半天时间。而这类操作恰好是 Python 文档处理库的强项。

4.1 脚本 6:基于模板批量生成 Word 文档

说到批量生成 Word 文档,很多人的第一反应是复杂的排版、样式不好控制。实际上对于办公场景而言,更需要的是批量填充“固定模板里的变动字段”,比如合同编号、甲方名称、金额、日期。我的做法是:先用 Word 做一个模板文件,在需要填充的位置写上特殊占位符,比如{contract_no}、{party_a},然后让 Python 读取模板并逐项替换。

使用python-docx库时有个需要注意的地方:它不能直接“替换”模板里任意位置的文本,因为文档本质上是 XML 结构,文字可能被拆在不同段落甚至不同 run 里。最稳妥的方式是把模板里每一个占位符写成一个独立的段落,然后通过遍历所有段落和 run 来找占位符。

from docx import Document def generate_contract(template_path, output_path, data): doc = Document(template_path) replace_pairs = { '{contract_no}': data['contract_no'], '{party_a}': data['party_a'], '{party_b}': data['party_b'], '{amount}': data['amount'], '{date}': data['date'], } for para in doc.paragraphs: for run in para.runs: for key, value in replace_pairs.items(): if key in run.text: run.text = run.text.replace(key, value) doc.save(output_path) print(f'生成文档: {output_path}') if __name__ == '__main__': contract_data = { 'contract_no': 'HT-2025-0012', 'party_a': '某某科技有限公司', 'party_b': '某省建筑公司', 'amount': '150000.00', 'date': '2025-04-15', } generate_contract(r'D:\模板\合同模板.docx', r'D:\输出\合同1.docx', contract_data)

踩坑提醒:python-docx处理不了的场景包括带复杂文本框、页眉页脚里包含占位符的情况,这些内容的 run 不一定在doc.paragraphs里。如果需要替换页眉或者表格里的占位符,还要额外遍历section.header和doc.tables。另外一个更省事的路线是,模板直接用 Excel 维护数据清单,再让脚本循环读取 Excel 里的每一行,批量生成几十份文档,数据和文档彻底分离,改起来也方便。

4.2 脚本 7:PDF 合并、拆分与提取页面

PDF 操作在办公场景里属于“看起来不起眼但经常卡壳”的需求。部门要交一份完整的项目材料,手上却有十几个单独 PDF;或者在质检报告里只需要截取其中几页发给客户。手工操作要么用付费软件,要么在线工具上传总觉得不安全,其实本地用 Python 几行代码就能解决。

我用的是pypdf这个库,它算是 PyPDF2 的继任者,接口更干净。下面这段代码实现了两个功能:把指定目录下所有 PDF 按文件名排序后合并成一个,以及从一个 PDF 里提取指定页码保存为新文件。

from pypdf import PdfReader, PdfWriter import glob import os def merge_pdfs(folder, output_path): pdf_files = sorted(glob.glob(folder + '/*.pdf')) writer = PdfWriter() for file in pdf_files: reader = PdfReader(file) for page in reader.pages: writer.add_page(page) with open(output_path, 'wb') as f: writer.write(f) print(f'合并完成: {output_path}(共 {len(writer.pages)} 页)') def extract_pages(input_pdf, output_pdf, page_list): reader = PdfReader(input_pdf) writer = PdfWriter() for page_num in page_list: writer.add_page(reader.pages[page_num - 1]) # 页码从1开始传 with open(output_pdf, 'wb') as f: writer.write(f) print(f'提取完成: {output_pdf}') if __name__ == '__main__': merge_pdfs(r'D:\项目资料', r'D:\合并项目.pdf') extract_pages(r'D:\合并项目.pdf', r'D:\目录页.pdf', [1, 3, 5])

关于 PDF 操作,有两个比较深的体会。第一是合并顺序:glob返回的顺序在 Windows 上看起来是按文件名排的,但严格来说并不保证,所以我习惯加sorted(),否则一不小心就把页码排乱了。第二是压缩:合并后的 PDF 如果太大,传微信经常失败,这时候可以考虑只保留需要的页面,或者用pypdf的compress_content_streams()压缩功能,但效果因文件而异,重压缩的图像类 PDF 效果有限。

5. 邮件通知类脚本:让程序替你发消息

邮件自动化的价值在于“定时、批量、规范化”。每周五下午要发周报、每月初要发财务报表、每逢发工资后要把工资条逐个发到员工邮箱。这类事情手工做起来极其枯燥,而且一旦发错收件人就是事故,交给脚本处理反而更可控。

5.1 脚本 8:带附件的自动发信

这个脚本是我所有自动化工具里使用频率最高的一个。每逢月底,我需要把汇总好的 Excel 报表通过邮件发出去。核心逻辑是连接 SMTP 服务器,登录发件邮箱,构造带附件的邮件并发送。用 Python 标准库里的smtplib加email模块就能完成,不用装任何额外第三方库。

import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication import os def send_mail(smtp_server, smtp_port, sender_pwd, sender, recipient, subject, body, attachments=[]): msg = MIMEMultipart() msg['From'] = sender msg['To'] = recipient msg['Subject'] = subject msg.attach(MIMEText(body, 'plain', 'utf-8')) for file_path in attachments: filename = os.path.basename(file_path) with open(file_path, 'rb') as f: part = MIMEApplication(f.read()) part.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', filename)) msg.attach(part) with smtplib.SMTP_SSL(smtp_server, smtp_port) as server: server.login(sender, sender_pwd) server.sendmail(sender, [recipient], msg.as_string()) print(f'邮件已发送至 {recipient}') if __name__ == '__main__': send_mail( smtp_server='smtp.qq.com', smtp_port=465, sender_pwd='你的授权码', sender='yourname@qq.com', recipient='boss@example.com', subject='3月销售数据分析报表', body='详见附件。', attachments=[r'D:\报表\3月销售数据.xlsx'] )

这里sender_pwd填的不是邮箱登录密码,而是 SMTP 授权码。各家邮箱获取授权码的方式大同小异,一般都在设置-账号-安全里面找“开启 SMTP 服务”后生成。我用这个脚本踩过最痛的坑就是端口:QQ 邮箱和网易的 SSL 端口是 465,有些企业邮箱的 SSL 端口是 465 或 994,而 587 通常配合 STARTTLS 使用,填错端口会直接超时。如果你用的是企业邮箱,建议先拿一个测试收件人跑通再说。

5.2 脚本 9:日报、周报、工资条的群发方案

批量群发和单发之间最大的区别在于:收件人不同,邮件正文、附件内容也不同。比如工资条,每位员工只能看到自己那一行数据,附件里的 Excel 也需要单独生成。这类需求用循环加定制化内容来完成,核心是数据和邮件模板分离。

我的做法是先维护一个 Excel 名单,里面包含姓名、邮箱以及工资条的各个字段。脚本遍历每一行,把该行数据格式化到正文模板里,同时生成一个只包含该行数据的 Excel 附件,再通过 SMTP 服务器逐个发送。

import pandas as pd import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication def send_batch_mail(employee_file): df = pd.read_excel(employee_file) smtp_server, smtp_port = 'smtp.qq.com', 465 sender = 'yourname@qq.com' sender_pwd = '你的授权码' with smtplib.SMTP_SSL(smtp_server, smtp_port) as server: server.login(sender, sender_pwd) for _, row in df.iterrows(): name = row['姓名'] email = row['邮箱'] salary = row['应发工资'] tax = row['个税'] actual = row['实发工资'] body = f'''{name} 您好: 您本月的工资条信息如下: 应发工资:{salary} 个税:{tax} 实发工资:{actual} 此邮件由系统自动发送,如有疑问请联系人事部。''' msg = MIMEMultipart() msg['From'] = sender msg['To'] = email msg['Subject'] = f'{name} - 本月工资条' msg.attach(MIMEText(body, 'plain', 'utf-8')) # 生成该员工专属附件 personal_df = row.to_frame().T.drop(columns=['邮箱']) temp_file = f'/tmp/{name}_工资条.xlsx' personal_df.to_excel(temp_file, index=False) with open(temp_file, 'rb') as f: part = MIMEApplication(f.read()) part.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', f'{name}_工资条.xlsx')) msg.attach(part) server.sendmail(sender, [email], msg.as_string()) print(f'已发送: {name} <{email}>') print('全部发送完毕') if __name__ == '__main__': send_batch_mail(r'D:\员工工资表.xlsx')

这里有件事我想专门提醒:批量发送邮件之前,务必先向测试邮箱发一轮,并且严格控制发送频率。部分邮箱服务商对单个账号的日发送量有配额,比如免费邮箱通常每天几百封,超过就会被暂时限制。我见过有同事一口气发 200 封工资条直接触发风控,邮件全部进垃圾箱。如果人员规模大,建议分批发送,中间加time.sleep(1)之类的延迟。

6. 系统辅助类脚本:定时调度和无人值守

脚本写出来只是第一步,真正让它产生长期价值的是“无人值守”。很多办公自动化脚本最佳的使用方式不是每天手动双击,而是设定好触发条件,让它在指定时间自动运行。这个环节我放在最后一个说,因为它能把前面的脚本从“工具”升级成“系统”。

6.1 脚本 10:定时任务调度与无人值守运行

在 Windows 上,最直接的方式是用任务计划程序;在 Linux 服务器上,用 cron。我个人的推荐是:如果脚本在个人电脑上运行,直接在 Windows 任务计划程序里配置就行,不需要额外装什么软件;如果脚本需要每天固定跑,且电脑不可能一直开着,那部署到云服务器或者内网的一台常开主机上更省心。

以 Windows 为例,打开“任务计划程序”创建基本任务,触发器选择“每天”,时间设成早上 9 点,操作选“启动程序”,程序和脚本填python,添加参数填你脚本的完整路径。这里有一个容易踩的坑:默认情况下任务计划程序启动的是当前系统用户环境,但如果你用的是venv虚拟环境,或者 Python 模块装在特定路径下,直接填python可能提示找不到模块。解决方法是把启动程序直接指向虚拟环境里的python.exe完整路径,例如D:\myenv\Scripts\python.exe。

在 Python 内部,我有时也会用schedule这个轻量库来实现简单的定时循环,适合那种不想折腾系统配置的场景。

import schedule import time def job(): print("开始执行定时任务...") # 在这里调用前面写的任意脚本,比如合并Excel、发邮件等 # from merge_excels import merge_excels # merge_excels(r'D:\月报数据', r'D:\月报汇总.xlsx') schedule.every().day.at("09:00").do(job) # 也可以写成 schedule.every().monday.at("10:00").do(job) if __name__ == '__main__': while True: schedule.run_pending() time.sleep(30)

schedule库适合轻量场景,但如果脚本本身要跑很长时间,或者要求更精细的调度策略,我还是推荐直接用系统自带的任务计划或 cron。另外记得在任务计划里勾选“如果任务运行时间超过 X 小时,停止任务”,避免脚本卡住后一直占用资源。

6.2 让脚本稳定运行的几个建议

脚本能跑起来和能稳定跑是两回事。我维护这些自动化脚本几年,最大的体会是:稳定性比功能更值钱。一个脚本如果 90% 的时间好用、10% 的时间出问题,那大概率最后会被人弃用,因为你永远不敢完全信任它。

我常用的提升稳定性的手段包括:统一在脚本开头用logging模块记录运行日志,方便出问题时定位;对可能不存在的路径做判断,先用os.path.exists()检查;在网络请求或 SMTP 发送这类外部操作上加上重试机制;每年年底检查一次依赖库的兼容性,因为 pandas 和 openpyxl 这类库升级后偶尔会有接口变化。

日志这一条尤其推荐做。我一开始写脚本只做print输出,后来脚本放在服务器上定时跑,输出根本看不到。改用logging后,每天自动生成的日志文件就像黑匣子,哪天数据不对了翻一下就知道了。

import logging logging.basicConfig( filename='auto_task.log', level=logging.INFO, format='%(asctime)s [%(levelname)s] %(message)s' ) logging.info('任务开始') try: # 业务逻辑 pass except Exception as e: logging.error(f'任务中断: {e}') logging.info('任务结束')

我在实际使用中的一个体会是:自动化脚本并不需要一开始就设计得很复杂。拿我自己来说,最开始只是写了一个自动归档下载文件夹的小脚本,后来逐步加了 Excel 合并、邮件发送、定时调度,形成了一个小小的工具库。每加一个脚本,省下的时间就多一点,而这份积累比任何一次性的大工程都实用。

如果你想往这个方向继续扩展,可以考虑几个方向:一是用 OCR 识别图片或扫描件里的文字,把纸质单据变成可检索的数据;二是把脚本封装成带简单界面的小工具,给不会用命令行的同事用;三是把定时任务、日志、异常通知串起来,做到真正的“无人值守”。这些方向在我自己接下来的工具清单里,也是我认为自动化办公最值得投入的地方。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 4:03:45

空气耦合超声单侧检测COMSOL仿真建模要点与工程实践

做复合材料无损检测的朋友应该都有感触&#xff0c;空气耦合超声这个方向听起来很美好——不用耦合剂、非接触、适合在线检测&#xff0c;但真要把仿真模型搭起来&#xff0c;问题一个接一个。我去年在做一个碳纤维层压板的分层缺陷检测方案时&#xff0c;甲方只允许从单侧接近…

作者头像 李华
网站建设 2026/10/1 4:03:41

MySQL索引优化实战:从B+树原理到复合索引与慢SQL排查

做后端开发和数据库相关工作这么多年&#xff0c;经常在运维群、技术群里看到有人贴一条慢SQL求助&#xff0c;点进去一看&#xff0c;typeALL&#xff0c;全表扫描&#xff0c;几十万行甚至上百万行的表硬扫。问的人一脸无辜&#xff1a;我建了索引啊&#xff0c;怎么还是慢&a…

作者头像 李华
网站建设 2026/10/1 4:03:40

Java Swing挂号系统实战:MySQL并发扣号与GUI线程安全

简介&#xff1a;这是一份面向计算机专业本科生与Java初学者的课程设计级医院挂号管理系统实战项目&#xff0c;聚焦GUI桌面应用开发与MySQL数据库综合实践&#xff0c;解决医疗场景下挂号、退号、信息查询与统计等核心业务流程。资源包共331个文件&#xff0c;含45个Java源码文…

作者头像 李华
网站建设 2026/10/1 4:03:05

Vibe Coding 与智能体驱动全栈开发:从需求到代码的工程化实践

1. 从“写代码”到“聊需求”&#xff1a;Vibe Coding 到底在解决什么问题第一次听到“Vibe Coding”这个词&#xff0c;是在一个做 AI 工具链的朋友群里。有人甩了张截图&#xff0c;说现在写全栈项目已经不怎么敲键盘了&#xff0c;对着编辑器把需求讲清楚&#xff0c;智能体…

作者头像 李华
网站建设 2026/10/1 4:01:51

JSP+Servlet+MySQL花店系统:Java Web入门实战全指南

简介&#xff1a;本资源是一套完整的基于JSP技术的毕业设计项目实战材料&#xff0c;面向计算机专业本科生及Java Web初学者&#xff0c;解决课程设计、毕设选题与系统开发实践中的全流程需求。压缩包共125个文件&#xff0c;涵盖35个JSP页面&#xff08;实现前后端交互&#x…

作者头像 李华
网站建设 2026/10/1 4:01:38

BDD100k+YOLOv5街景检测实战:数据对齐与模型适配指南

简介&#xff1a;本资源是在BDD100k交通场景数据集上完整实现YOLOv5s目标检测模型训练的工程实践包&#xff0c;面向计算机视觉初学者与算法工程师&#xff0c;解决自动驾驶、智能监控等场景中车辆、行人等关键目标检测的模型复现与调优问题。压缩包共85个文件&#xff0c;涵盖…

作者头像 李华