资讯动态

10个Python自动化脚本:告别重复劳动,提升工作效率

发布时间:2026/10/14 5:23:33 来源:尧图企业网站定制
工作这十年我写得最多的其实不是业务代码而是一堆不起眼的自动化小脚本。它们没有闪光的技术亮点却实打实把我从“复制粘贴、重复点击”的泥潭里捞了出来。平时听到同事抱怨“又要在几百个文件里挑出带关键字的”、“这个月报表合了一下午”我心里都会默默想这活儿十分钟就能搞定。这篇文章我就把平时最常用的10个Python自动化脚本整理出来逐个说清楚它们能解决什么问题、核心逻辑长什么样、实操时有哪些容易踩的坑。不管你基础如何看完至少能照葫芦画瓢改出自己那版。1. 为什么选择用Python写自动化脚本1.1 自动化脚本的价值在于“挤出时间”很多人一听“自动化脚本”就觉得这是程序员炫技的东西其实恰恰相反脚本最大的价值不是代码写得漂亮而是把那些“规则明确、重复度高、不出成绩”的工作一次性接管过来。我见过最典型的一个场景某公司运营同学每周一早上要手动打开五个Excel文件筛选出上上周的订单数据然后填到一张汇总表里。这套流程他干了两年每次大约四十分钟。后来我用Python给他写了个脚本数据一放进去双击运行三十秒出结果。他省下的时间拿去做了真正需要人判断的事情分析为什么某个地区的退货率突然升高。这才是自动化的本质不是替代人而是把人从低价值劳动中释放出来。1.2 什么样的任务值得写成脚本不是所有事情都值得自动化。我判断一个任务能不能写成脚本通常看三个条件第一规则是否清晰。如果一件事连你都说不清楚“什么情况怎么处理”那脚本更没办法替你判断。比如“把文件按类型整理”类型是明确的但“把重要的文件挑出来”重要是个模糊概念得先把它变成具体条件。第二频率是否够高。一次性任务也值得写但投入产出比不划算除非这个任务特别复杂光靠人做容易出错。高频任务才是脚本的主场每天、每周、每月固定重复的事情写一次脚本能用上一年甚至更久。第三出错成本是否够高。手工操作最容易在重复劳动中出错漏一个字段、错一个格式、忘记保存这些低级错误在数据量大时几乎无法避免。脚本只要逻辑正确每次执行的结果都是一致的不会因为“今天状态不好”而出错。1.3 脚本选型的几个原则真正写得多之后我就总结出了几条属于自己的铁律。宁可简单不要花哨。我见过有人用Python写了个带图形界面的文件整理工具界面做得挺漂亮但代码量翻了好几倍。如果你的脚本只是自己用或者给身边几个同事用命令行交互就够了加图形界面纯属给自己找事。善用现成库不要什么都自己造。Python在自动化领域之所以好用就是因为生态太全了。处理Excel有openpyxl和pandas处理图片有Pillow抓网页有requests加BeautifulSoup定时任务有schedule。这些库都是经过了大量生产环境检验的比你自己手搓的轮子稳妥得多。先跑通再优化。很多初学者一上来就想写一个“完美”的脚本各种异常处理、配置化、日志输出一应俱全。我的习惯是先写一个能跑的版本确认核心逻辑没问题再根据实际使用中的问题慢慢迭代。脚本这种东西能用比好看重要一百倍。2. 十个高频自动化场景拆解2.1 按扩展名自动整理文件夹这是一个最入门的脚本却也是身边朋友好评率最高的一个。它的工作是把一个杂乱无章的文件夹里的文件按扩展名归类到不同子目录里比如图片归到“图片”、文档归到“文档”、压缩包归到“压缩包”。核心逻辑其实很简单遍历目标文件夹下所有文件用os.path.splitext取出扩展名再根据扩展名映射到不同的目标文件夹最后os.rename或shutil.move移动过去。这里有个细节值得注意移动之前一定要先判断目标文件夹是否存在不存在就先创建否则会直接报错。另外我习惯把配置文件单独放在一个列表里做映射这样以后想新增一个分类改一行列表就够了不用动核心代码。2.2 批量重命名文件批量重命名的需求比想象中多得多。有人要批量给图片加日期前缀有人要把“项目A_最终版_v3.docx”这种乱七八糟的名字统一成“20240512_项目A_报告.docx”还有人要把几百个文件里的空格全部替换成下划线。实现思路主要分三步用os.listdir或glob拿到文件列表然后通过字符串处理生成新文件名最后用os.rename改名。字符串处理是核心我的建议是先用print把新旧名字对照打出来确认没问题再真正改名。干过这事的都知道几百个文件改错名想恢复那才是真正的灾难。2.3 图片压缩与格式转换图片处理是我用得最频繁的脚本之一。无论是做PPT配图、上传网站还是发邮件图片太大都是痛点。一个几十兆的图片文件夹压缩之后可能只有两三兆速度还特别快。核心工具是Pillow库。打开图片后用thumbnail方法按比例缩放再用save方法重新保存quality参数控制压缩质量85到90是个甜点区间肉眼看不出差别体积却能减小一大半。格式转换更简单Pillow打开图片后直接另存成目标格式就行。需要注意一点如果图片有透明度通道比如PNG转JPEG直接转换会丢透明背景必须先用convert(RGB)处理否则存出来的JPEG背景是黑色的。我第一次转的时候没注意这个做了十几张图全废了。2.4 Excel数据清洗与合并有些所谓的“数据分析”本质就是体力活。比如一个月度销售数据分散在30张工作表里需要把它们合并成一张总表然后做一些简单的汇总统计。用Python做这件事熟练之后也就是一百行代码的事。pandas是处理这种任务的主力。read_excel可以批量读取concat负责纵向合并groupby做分类统计最后一行to_excel把结果写出去。这套组合拳对付常见的Excel操作基本够用。有个实操经验读取Excel时最好加上dtypestr参数强制所有列以文本形式读入否则某些列的数字会被自动识别成浮点数导致“00123”变成“123”“工号”“编号”这类列就容易出问题。这种数据污染在合并数据时特别坑还特别难排查。2.5 网页信息批量抓取很多人问“爬虫是不是很复杂”其实对于自己日常用的小需求一点也不复杂。比如我经常要批量查询某个网站的公开信息几十个链接一个个打开复制粘贴效率太低了。用requests请求页面再用BeautifulSoup定位元素写个循环就完了。选选择器的时候有个小技巧尽量不要用那种又长又容易变的CSS路径优先用带有明确语义的选择器比如find(h2, class_title)这样就算网站的样式稍微调整一下脚本也不容易挂。另一个必须提醒的点要尊重网站的robots协议控制请求频率别给人家服务器造成压力。我在脚本里习惯加个sleep(1)每请求一次就歇一秒。数据少时的确慢点但换来的是稳定和友好划算。2.6 定时自动备份备份这件事道理谁都懂但能做到的人真不多。不是懒是总忘。解决遗忘问题的最好办法不是靠记性而是靠定时任务。Windows上的计划任务、macOS上的launchd、Linux上的crontab都能做到定时执行。但Python自己也有个schedule库用几行代码就能实现“每天下午六点执行备份函数”。这属于躺平式自动化写一次忘掉它它在后台替你干活。备份时要考虑两个细节一是备份文件最好带时间戳比如backup_20240512.zip方便以后按时间找回二是备份方式先拷贝到临时目录再打包避免文件正在被占用时打包出损坏的压缩包。2.7 邮件报表自动发送自动发邮件最典型的应用场景是定时报表。数据脚本把统计结果算完之后用smtplib和email库把Excel或PDF附件发到指定邮箱整个流程就能完全跑通不用人工干预。这里比较容易踩坑的是邮箱服务的授权密码问题。现在主流邮箱基本都要求用“授权码”而不是登录密码来登录SMTP服务很多人第一次配置失败原因就在这里。另外邮件正文我建议用HTML格式不要用纯文本。HTML邮件可以做一些简单的排版比如把重点数据标红加粗对方打开邮件一眼就能看到关键信息体验完全不一样。2.8 日志关键词监控与报警服务器日志动辄几十兆人眼根本看不过来。我的做法是写一个脚本定时读取日志文件的新增部分用正则匹配关键词比如“ERROR”“Exception”“连接超时”一旦命中就把相关行发到即时通讯工具或者邮件里。实现上要注意一个细节日志文件一般很大不能每次从头读一遍。要记住上一次读取到的位置用seek跳过去只读新增内容。不然日志一大脚本效率会越来越低最终变成自己都不愿意跑的废物脚本。2.9 磁盘空间预警磁盘满了这件事对开发者和设计师来说是家常便饭但对普通用户来说往往是电脑突然卡到没法用才发现。与其等到那天不如提前写个监控脚本。脚本的逻辑很直接用shutil.disk_usage获取磁盘总空间、已用空间和剩余空间算出使用率超过阈值就发提醒。把这个脚本挂在定时任务里每天跑一次基本就能避免“磁盘满了才发现”的窘境。2.10 文本批量提取与格式转换这算是一个万金油脚本主要解决两类问题一是从一堆文档中批量提取某些字段比如从一个TXT文件中提取所有手机号二是把一种格式批量转成另一种比如多张Word文档统一转成PDF或者纯文本。提取字段用正则表达式最方便。格式转换的工具看情况转PDF我用docx2pdf转纯文本用python-docx转换前最好先检查源文件是否损坏否则中途报错会很麻烦。3. 实操三个核心脚本的完整实现3.1 文件自动归类脚本这个脚本可以作为你的第一个自动化项目代码量不大效果立竿见影。我这里给出一个相对完整的版本import os import shutil from pathlib import Path # 分类规则扩展名 - 目标文件夹 RULES { 图片: [.jpg, .jpeg, .png, .gif, .bmp, .webp], 文档: [.doc, .docx, .pdf, .txt, .md, .xls, .xlsx], 压缩包: [.zip, .rar, .7z, .tar, .gz], 视频: [.mp4, .avi, .mkv, .mov], 音频: [.mp3, .wav, .flac, .aac], 代码: [.py, .js, .html, .css, .java, .c, .cpp], 其他: [], } def classify(file: Path) - str: ext file.suffix.lower() for category, extensions in RULES.items(): if not extensions: continue if ext in extensions: return category return 其他 def organize_folder(folder: str): folder Path(folder) if not folder.exists(): print(f文件夹不存在: {folder}) return for item in folder.iterdir(): if item.is_dir(): continue # 不处理子文件夹本身 category classify(item) target_dir folder / category target_dir.mkdir(exist_okTrue) target_path target_dir / item.name if target_path.exists(): # 重名文件加时间戳避免覆盖 new_name f{item.stem}_{item.stat().st_mtime:.0f}{item.suffix} target_path target_dir / new_name shutil.move(str(item), str(target_path)) print(f已移动: {item.name} - {category}/) if __name__ __main__: organize_folder(rD:\下载文件)运行前建议先注释掉shutil.move那行换成print预览一遍处理结果。确认分类规则符合预期后再真正执行移动。别人踩过的坑你就别踩了尤其是“把某个文件夹误判成文件”这种低级错误一旦大量移动错了恢复起来非常麻烦。这个脚本还可以进一步扩展比如按文件的修改时间归类到“2024年1月”“2024年2月”这样的子目录改成按年度分层的文件夹结构。原理都一样只是分类函数的逻辑不同。3.2 图片批量压缩脚本图片压缩脚本在线办公场景里太常见了也是我日常工作使用频率最高的脚本之一。直接上代码import os from pathlib import Path from PIL import Image def compress_images(source_folder: str, target_folder: str, max_width1920, quality85): source Path(source_folder) target Path(target_folder) target.mkdir(exist_okTrue) supported {.jpg, .jpeg, .png, .bmp, .webp} for img_path in source.iterdir(): if img_path.suffix.lower() not in supported: continue try: with Image.open(img_path) as img: # 转换色彩模式避免PNG透明背景转JPEG出现黑色底 if img_path.suffix.lower() .png: img img.convert(RGB) # 等比缩放控制最大宽度 if img.width max_width: ratio max_width / img.width new_height int(img.height * ratio) img img.resize((max_width, new_height), Image.LANCZOS) # 统一输出为JPEG output_path target / f{img_path.stem}.jpg # 保存quality控制压缩质量optimize减小体积progressive让图片边下边显示 img.save(output_path, JPEG, qualityquality, optimizeTrue, progressiveTrue) original_size img_path.stat().st_size / 1024 compressed_size output_path.stat().st_size / 1024 print(f{img_path.name}: {original_size:.1f}KB - {compressed_size:.1f}KB) except Exception as e: print(f处理失败: {img_path.name}, 原因: {e}) if __name__ __main__: compress_images(rD:\照片原图, rD:\照片压缩)几个参数的选择我解释一下quality85是我试过最稳的区间再低画质会有可见损失再高体积降不下来多少max_width1920适合大多数网站和文档配图场景如果你只是发微信1280就够。Image.LANCZOS是做高质量缩放的经典算法处理出来的图片在缩小后依然能保持清晰。还有一个生产环境的小经验压缩时如果遇到“不支持这种模式”的错误十有八九是图片色彩模式的问题。先用img.convert(RGB)转一下基本都能解决。3.3 Excel报表自动合并报表合并脚本是办公室场景里使用最广的也是最能体现pandas优势的地方。这里给一个实际的参考案例import pandas as pd from pathlib import Path def merge_excel(folder: str, output_file: str, sheet_index0): folder Path(folder) all_data [] errors [] # 找出所有Excel文件 excel_files list(folder.glob(*.xlsx)) list(folder.glob(*.xls)) if not excel_files: print(没有找到Excel文件) return print(f共找到 {len(excel_files)} 个Excel文件) for file in excel_files: try: # 强制读成字符串防止工号/编号变成科学计数法 df pd.read_excel(file, sheet_namesheet_index, dtypestr) # 加一列标记数据来源 df[数据来源] file.stem all_data.append(df) print(f读取成功: {file.name}, 共 {len(df)} 行) except Exception as e: errors.append((file.name, str(e))) print(f读取失败: {file.name}, 原因: {e}) if not all_data: print(没有成功读取任何文件) return # 纵向合并所有数据 result pd.concat(all_data, ignore_indexTrue) # 去重保留第一次出现的记录 result result.drop_duplicates() # 简单统计按某一列分组计数这里以“地区”列示例 if 地区 in result.columns: summary result.groupby(地区).size().reset_index(name数量) print(summary) # 写入结果 with pd.ExcelWriter(output_file, engineopenpyxl) as writer: result.to_excel(writer, sheet_name合并数据, indexFalse) print(f合并完成共 {len(result)} 行输出到: {output_file}) if errors: print(f共有 {len(errors)} 个文件读取失败请检查) if __name__ __main__: merge_excel(rD:\分店报表, rD:\月度汇总.xlsx)这里有一个容易被忽略的细节用dtypestr读入Excel表面上看只是把类型统一成了字符串实际上能躲过一大类数据精度问题。比如Excel里输入“0012”默认会保存成数字12但你读进来变成字符串后“0012”才能保留原样。如果你的编号本身就带前导零这一步绝对不能省。drop_duplicates()默认保留第一条记录如果你的业务规则是“保留最新一条”那就需要先按时间排序再用keeplast。我做过的一次需求就是这类当时没有注意排序规则结果保留的数据全是旧版本好在及时发现。4. 常见问题与排查技巧实录4.1 中文路径和编码问题这是Windows用户最常见的坑。Python在Windows下处理中文路径偶尔会遇到编码异常的报错尤其是早期版本的Python。现在的Python 3基本解决得不错但如果你用的还是老版本建议升级到3.8以上。另外文件读写时尽量显式指定编码比如open(file.txt, r, encodingutf-8)不然遇到GBK编码的文件默认读取方式会直接报错。还有一种情况是脚本本身保存为UTF-8但在Windows的记事本打开时会带BOM头可能导致Python报SyntaxError: unexpected byte。解决办法是别用记事本写代码用VS Code或PyCharm这类专业编辑器保存时选择UTF-8无BOM即可。4.2 依赖库版本冲突Python的第三方库更新特别快有些库的大版本之间API差异巨大最典型的就是pandas。网上很多教程是老版本写的你拿着新版本代码去跑很可能直接报错。解决这类问题我强烈建议给关键项目建一个虚拟环境每个项目独立装一套依赖互不干扰。命令就几个python -m venv venv venv\Scripts\activate # Windows source venv/bin/activate # macOS/Linux pip install pandas openpyxl pillow requests beautifulsoup4如果实在不想折腾虚拟环境那就在脚本里锁定版本号pip install pandas2.0.3至少保证今天能跑明天升级了也不会突然崩。4.3 定时任务为什么不执行定时任务脚本写好了放在计划任务里却死活不跑这是很多人都遇到过的问题。我排查这类问题一般按三个方向来找第一看Python解释器路径对不对。计划任务里填的python如果不是绝对路径系统可能找不到。在Windows上常见的Python路径是C:\Python312\python.exe一定要写绝对路径。第二看工作目录对不对。脚本里如果有相对路径比如读取data.xlsx这个文件相对于哪里计划任务执行时的默认工作目录往往不是你想象的那个位置。要么把脚本里的路径全部写成绝对路径要么在计划任务里把“起始于”目录设置成脚本所在目录。第三看权限够不够。有些操作需要管理员权限比如写入系统目录、修改环境变量。如果计划任务是普通用户身份运行权限不足就静默失败。排查时可以先用命令行手动执行一次能跑成功再丢到计划任务里。4.4 脚本运行速度太慢怎么办自动化脚本如果跑得比人还慢那就失去意义了。我踩过几次性能的坑分享几条最有效的优化手段。处理大量文件时能用pathlib.Path.iterdir()就不要用os.listdir加字符串拼接前者在内部处理路径时更高效。处理大数据量时能用pandas的向量化操作就不要用for循环一行行遍历相差可能几十倍。另外一个非常实用的技巧如果脚本要处理几千个文件加上multiprocessing或者concurrent.futures的多线程分分钟跑完。但要注意多线程处理文件时输出文件不要重名每个线程负责的子任务要划分清楚。最后一条可能反直觉在脚本里减少print。很多人习惯每处理一个文件就print一行几千个文件就要刷几千行屏幕打印本身也占时间。真要确认进度就print关键节点比如每处理100个打一行。5. 脚本落地之后我的一些习惯写了几年自动化脚本踩过的坑少说也有几十个了。有些教训是教训有些习惯则成了肌肉记忆。比如我养成了一个习惯所有脚本运行之前先让脚本打印将要执行的操作确认无误再用--run参数真正执行。这种“预演模式”虽然多了一道工序却帮我避免了好几次批量误操作的灾难。还有一个习惯是给脚本加日志输出。我给每个脚本都准备了一个简单的logs目录运行结果和错误信息写进日志文件里方便出问题时回溯。脚本刚开始看不觉得有什么等你哪天发现数据异常想倒查原因就明白日志有多重要了。如果你看完也想动手写自己的自动化脚本我的建议是不要贪多从每天最烦的一件小事开始。文件太乱了就先整理文件Excel处理得烦就先合并Excel。把一件小事自动化掉你就能感受到那种“省下来的时间”的快感然后自然会有动力去做下一个。自动化这件事门槛低到不像是技术活但做久了你会发现它真正改变的是你对“重复劳动”这件事的敏感度——以后再遇到任何重复的事情你的第一反应都会是这能不能写个脚本

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑