)
我用 Python 写了 10 个自动化脚本每天省出 2 小时从文件整理到数据处理附完整代码适合每天有大量重复性电脑操作的开发者、运营、内容创作者。本文 10 个脚本全部可直接运行覆盖文件处理、数据清洗、批量操作等高频场景。背景你的 2 小时去哪了我统计过自己一天的隐形时间消耗操作每天耗时频次整理下载文件夹按类型分类10 分钟2 次批量重命名文件5 分钟1 次从 Excel 提取数据写报告20 分钟1 次批量压缩图片10 分钟1 次检查网页内容是否更新15 分钟3 次批量转换文件格式10 分钟1 次汇总多个 CSV 文件15 分钟1 次定时备份指定目录5 分钟1 次批量替换文本内容10 分钟2 次监控文件夹变化并通知5 分钟持续加起来每天2 小时花在重复操作上。下面 10 个 Python 脚本把这些操作全部自动化了。脚本 1自动整理下载文件夹按文件类型自动分类到子文件夹。importosimportshutilfrompathlibimportPathdeforganize_downloads(download_dir):按文件类型整理下载文件夹# 类型→文件夹映射type_map{图片:[.jpg,.jpeg,.png,.gif,.webp,.svg],文档:[.pdf,.doc,.docx,.txt,.md,.xlsx,.pptx],视频:[.mp4,.avi,.mkv,.mov],音频:[.mp3,.wav,.flac,.aac],压缩包:[.zip,.rar,.7z,.tar,.gz],代码:[.py,.js,.html,.css,.java,.go],}download_pathPath(download_dir)moved0forfileindownload_path.iterdir():iffile.is_file():extfile.suffix.lower()forfolder,extensionsintype_map.items():ifextinextensions:target_dirdownload_path/folder target_dir.mkdir(exist_okTrue)shutil.move(str(file),str(target_dir/file.name))moved1print(f移动:{file.name}→{folder}/)breakprint(f整理完成共移动{moved}个文件)# 使用organize_downloads(rC:\Users\Administrator\Downloads)脚本 2批量重命名文件按规则批量重命名支持正则替换。importosimportredefbatch_rename(directory,pattern,replacement):批量重命名文件正则替换count0forfilenameinos.listdir(directory):new_namere.sub(pattern,replacement,filename)ifnew_name!filename:old_pathos.path.join(directory,filename)new_pathos.path.join(directory,new_name)os.rename(old_path,new_path)print(f重命名:{filename}→{new_name})count1print(f共重命名{count}个文件)# 示例把文件名中的空格替换为下划线batch_rename(rC:\files,r\s,_)# 示例给所有 txt 文件加日期前缀batch_rename(rC:\files,r^(.\.txt)$,r2026_\1)脚本 3批量压缩图片把目录下所有图片压缩到指定大小以内。fromPILimportImageimportosdefcompress_images(input_dir,output_dir,max_size_kb500):批量压缩图片到指定大小os.makedirs(output_dir,exist_okTrue)count0forfilenameinos.listdir(input_dir):ifnotfilename.lower().endswith((.jpg,.jpeg,.png)):continueinput_pathos.path.join(input_dir,filename)output_pathos.path.join(output_dir,filename)imgImage.open(input_path)# 先缩小分辨率ifmax(img.size)1920:ratio1920/max(img.size)new_size(int(img.width*ratio),int(img.height*ratio))imgimg.resize(new_size,Image.LANCZOS)# 逐步降低质量直到目标大小forqualityinrange(85,10,-5):img.save(output_path,qualityquality,optimizeTrue)size_kbos.path.getsize(output_path)/1024ifsize_kbmax_size_kb:breakprint(f压缩:{filename}→{size_kb:.0f}KB (质量{quality}))count1print(f共压缩{count}张图片)# 使用compress_images(images_raw,images_compressed,max_size_kb300)脚本 4从 Excel 提取数据生成报告importpandasaspddefgenerate_report(excel_path,output_path):从 Excel 读取数据生成 Markdown 汇总报告dfpd.read_excel(excel_path)report[]report.append(f# 数据报告\n)report.append(f数据来源:{excel_path}\n)report.append(f总行数:{len(df)}总列数:{len(df.columns)}\n)# 数值列统计numeric_colsdf.select_dtypes(includenumber).columnsiflen(numeric_cols)0:report.append(## 数值统计\n)report.append(| 列名 | 均值 | 最大值 | 最小值 | 中位数 |\n)report.append(|------|------|--------|--------|--------|\n)forcolinnumeric_cols:report.append(f|{col}|{df[col].mean():.2f}|{df[col].max()}|{df[col].min()}|{df[col].median():.2f}|\n)# 空值统计null_countsdf.isnull().sum()ifnull_counts.sum()0:report.append(\n## 空值统计\n)forcol,countinnull_counts[null_counts0].items():report.append(f-{col}:{count}个空值\n)withopen(output_path,w,encodingutf-8)asf:f.writelines(report)print(f报告已生成:{output_path})# 使用generate_report(sales_data.xlsx,report.md)脚本 5批量合并 CSV 文件importpandasaspdimportglobdefmerge_csv(input_pattern,output_path):合并多个 CSV 文件filesglob.glob(input_pattern)dfs[]forfileinfiles:dfpd.read_csv(file)df[_source]file# 记录来源dfs.append(df)print(f读取:{file}({len(df)}行))mergedpd.concat(dfs,ignore_indexTrue)merged.to_csv(output_path,indexFalse,encodingutf-8-sig)print(f合并完成:{len(files)}个文件 →{len(merged)}行 →{output_path})# 使用merge_csv(data/*.csv,merged_data.csv)脚本 6检查网页内容是否更新importhashlibimportjsonimportrequestsfrompathlibimportPath CACHE_FILEweb_monitor_cache.jsondefcheck_web_update(url):检查网页内容是否更新# 加载缓存cache{}ifPath(CACHE_FILE).exists():cachejson.loads(Path(CACHE_FILE).read_text(encodingutf-8))# 获取当前内容try:resprequests.get(url,timeout10)current_hashhashlib.md5(resp.text.encode()).hexdigest()exceptExceptionase:print(f获取失败:{url}-{e})returnFalse# 对比old_hashcache.get(url)ifold_hashisNone:cache[url]current_hashprint(f首次监控:{url})elifold_hash!current_hash:cache[url]current_hashprint(f✅ 内容更新:{url})else:print(f未变化:{url})Path(CACHE_FILE).write_text(json.dumps(cache,ensure_asciiFalse,indent2),encodingutf-8)returnold_hashisnotNoneandold_hash!current_hash# 使用check_web_update(https://blog.csdn.net/nav/ai)脚本 7批量文本替换importosdefbatch_replace_text(directory,old_text,new_text,extensions(.md,.txt,.py)):批量替换目录下所有文件中的指定文本count0forroot,dirs,filesinos.walk(directory):forfilenameinfiles:ifnotfilename.endswith(extensions):continuefilepathos.path.join(root,filename)contentopen(filepath,encodingutf-8).read()ifold_textincontent:new_contentcontent.replace(old_text,new_text)open(filepath,w,encodingutf-8).write(new_content)count1print(f替换:{filepath})print(f共替换{count}个文件)# 使用batch_replace_text(articles,旧公司名,新公司名)脚本 8定时备份指定目录importshutilimportosfromdatetimeimportdatetimedefbackup_directory(source_dir,backup_root):备份目录自动加日期后缀date_strdatetime.now().strftime(%Y%m%d_%H%M%S)source_nameos.path.basename(source_dir.rstrip(\\/))backup_pathos.path.join(backup_root,f{source_name}_{date_str})shutil.copytree(source_dir,backup_path)print(f备份完成:{source_dir}→{backup_path})# 清理超过 7 天的旧备份importglob backupssorted(glob.glob(os.path.join(backup_root,f{source_name}_*)))whilelen(backups)7:oldbackups.pop(0)shutil.rmtree(old)print(f清理旧备份:{old})# 使用backup_directory(rC:\projects\myproject,rD:\backups)脚本 9文件夹监控 自动处理importtimeimportosdefwatch_folder(folder_path,callback,interval5):监控文件夹变化新增文件触发回调seenset(os.listdir(folder_path))print(f开始监控:{folder_path})whileTrue:time.sleep(interval)currentset(os.listdir(folder_path))new_filescurrent-seenforfilenameinnew_files:filepathos.path.join(folder_path,filename)ifos.path.isfile(filepath):print(f发现新文件:{filename})callback(filepath)seencurrent# 使用新文件自动整理defauto_process(filepath):iffilepath.endswith(.md):print(f → 检测到 Markdown 文件自动处理)eliffilepath.endswith((.jpg,.png)):print(f → 检测到图片自动压缩)watch_folder(rC:\watch_folder,auto_process,interval3)脚本 10批量转换文件编码importosdefconvert_encoding(input_dir,from_encgbk,to_encutf-8):批量转换文件编码count0forroot,dirs,filesinos.walk(input_dir):forfilenameinfiles:ifnotfilename.endswith((.txt,.csv,.md,.py)):continuefilepathos.path.join(root,filename)try:contentopen(filepath,encodingfrom_enc).read()open(filepath,w,encodingto_enc).write(content)count1print(f转换:{filename}({from_enc}→{to_enc}))exceptUnicodeDecodeError:print(f跳过:{filename}(编码不匹配))print(f共转换{count}个文件)# 使用convert_encoding(old_files,from_encgbk,to_encutf-8)踩坑记录坑 1shutil.move 遇到同名文件症状移动文件时如果目标目录已有同名文件直接报错。解决移动前检查是否存在存在则加序号后缀。iftarget.exists():stemtarget.stem suffixtarget.suffix i1whiletarget.exists():targettarget_dir/f{stem}_{i}{suffix}i1坑 2正则替换文件名特殊字符症状文件名含[]()等正则特殊字符替换结果不对。解决用re.escape()转义特殊字符。坑 3Excel 读取中文列名乱码症状pd.read_excel()读出来的中文列名是乱码。解决指定编码encodingutf-8-sig或者用pd.read_excel()时不需要指定编码Excel 格式自带编码信息。坑 4文件监控脚本 CPU 占用高症状watch_folder脚本跑一会儿 CPU 就飙到 10%。原因interval1轮询太频繁。解决把 interval 设到 5 秒以上或者用watchdog库的事件驱动模式。坑 5备份脚本磁盘空间不足症状备份几次后磁盘满了。解决备份前检查剩余空间不足时清理最旧的备份。总结3 条经验先统计再自动化。花 1 天记录自己的重复操作找到最耗时的环节再写脚本别什么都自动化。脚本 手动 工具。简单的文件操作用 Python 脚本比装软件更轻量也不会有软件收费或兼容性问题。加日志和异常处理。生产用的脚本一定要加 try-except 和 print 日志出问题时才能排查。你日常有哪些重复操作想自动化评论区聊聊说不定下篇就写你提的需求。