回复“书籍”即可获赠Python从入门到进阶共10本电子书
今
日
鸡
汤
不识庐山真面目,只缘身在此山中 。
前一阵子针对近期爆火的《给阿嬷的情书》电影写了一篇Python网络爬虫+数据分析文章,基于 Python 的《给阿嬷的情书》豆瓣短评文本挖掘与情感分析(附数据分析代码),当前阅读量已经突破1.2w了,是今年迄今为止本公众号阅读量最高的一篇文章。正是因为这篇文章的贡献,也让许多粉丝慕名前来,加上了好友。部分粉丝在工作和学习中,遇到了一些难题,提了一些自己的需求,我把需求也及时同步发布到我的接单群了。


import osimport shutilimport zipfileimport win32com.clientimport subprocess# ===================== 配置区 =====================WORK_FOLDER = r"C:\Users\Desktop\new_project"OLD_TEXT = "Non-Negotiable"NEW_TEXT = "Original"TEMP_DOCX_FOLDER = "temp_docx_cache"# =================================================def kill_winword():"""强制结束WPS/Word后台进程,替代.Quit()"""try:subprocess.call(["taskkill", "/f", "/im", "WINWORD.EXE"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)except:passdef doc_to_docx(doc_path, out_docx_path):"""第一步:单个doc转为docx(WPS兼容,无Quit)"""word = win32com.client.Dispatch("Word.Application")word.Visible = Falseword.DisplayAlerts = 0flag = Falsetry:doc = word.Documents.Open(os.path.abspath(doc_path))doc.SaveAs(os.path.abspath(out_docx_path), FileFormat=16)doc.Close()flag = Trueexcept Exception as e:print(f"❌ 转换失败 {doc_path}: {e}")finally:# 释放对象,杀进程替代Quitdel wordkill_winword()return flagdef xml_replace_docx(docx_path, output_docx):"""第二步:XML底层替换docx水印(稳定100%命中艺术字)"""temp_unzip = "tmp_unzip_single"if os.path.exists(temp_unzip):shutil.rmtree(temp_unzip)os.mkdir(temp_unzip)# 解压docxwith zipfile.ZipFile(docx_path, "r") as zf:zf.extractall(temp_unzip)# 全局替换所有xml文本for root, _, files in os.walk(temp_unzip):for fname in files:if fname.endswith(".xml"):fp = os.path.join(root, fname)with open(fp, "r", encoding="utf-8") as f:content = f.read()content = content.replace(OLD_TEXT, NEW_TEXT)with open(fp, "w", encoding="utf-8") as f:f.write(content)# 重新打包with zipfile.ZipFile(output_docx, "w", zipfile.ZIP_DEFLATED) as new_zf:for root, _, files in os.walk(temp_unzip):for fname in files:fp = os.path.join(root, fname)rel_p = os.path.relpath(fp, temp_unzip)new_zf.write(fp, rel_p)shutil.rmtree(temp_unzip)return Truedef docx_to_doc(docx_path, out_doc_path):"""第三步:替换完的docx转回原生doc格式(WPS兼容)"""word = win32com.client.Dispatch("Word.Application")word.Visible = Falseword.DisplayAlerts = 0flag = Falsetry:doc = word.Documents.Open(os.path.abspath(docx_path))doc.SaveAs(os.path.abspath(out_doc_path), FileFormat=0)doc.Close()flag = Trueexcept Exception as e:print(f"❌ 转回doc失败 {docx_path}: {e}")finally:del wordkill_winword()return flagdef full_batch_pipeline():# 初始化临时目录if os.path.exists(TEMP_DOCX_FOLDER):shutil.rmtree(TEMP_DOCX_FOLDER)os.mkdir(TEMP_DOCX_FOLDER)success_total = 0fail_total = 0# 遍历文件夹所有原始docfor fname in os.listdir(WORK_FOLDER):if fname.lower().endswith(".doc") and not fname.startswith("成品_"):origin_doc = os.path.join(WORK_FOLDER, fname)temp_docx = os.path.join(TEMP_DOCX_FOLDER, fname.replace(".doc", ".docx"))replaced_docx = os.path.join(TEMP_DOCX_FOLDER, "mod_" + fname.replace(".doc", ".docx"))final_doc = os.path.join(WORK_FOLDER, f"成品_{fname}")print(f"\n===== 开始处理:{fname} =====")# 步骤1 doc→docxif not doc_to_docx(origin_doc, temp_docx):fail_total +=1continue# 步骤2 XML替换水印xml_replace_docx(temp_docx, replaced_docx)# 步骤3 docx→docif docx_to_doc(replaced_docx, final_doc):success_total +=1print(f"✅ {fname} 流水线全部完成,输出:成品_{fname}")else:fail_total +=1# 清理临时缓存shutil.rmtree(TEMP_DOCX_FOLDER)kill_winword()print(f"\n==================== 批量汇总 ====================")print(f"成功处理文件:{success_total} 个")print(f"失败文件:{fail_total} 个")print(f"成品文件统一带前缀「成品_」,原始doc完全保留未改动")if __name__ == "__main__":full_batch_pipeline()


1、环境要求:Windows 系统 + 安装 Microsoft Word / WPS Office;2、先关闭所有 WPS/Word 窗口,任务管理器结束所有WINWORD.EXE进程;3、前置操作:老式.doc文件请先手动另存为.docx格式;4、使用方法:python代码和docx文档放同一文件夹,修改文件名后运行;5、安全保障:脚本不会修改原始文件,全部生成新文件,格式、内容、水印样式完整保留;6、如有报错,到时候发来看看,排查

今日鸡汤分享:因童心未泯,梦想才会继续长大,载着童心出发,驶向的每一程都是童话。祝大小朋友们节日快乐!
说明:我平时有正式工作,只做兼职副业,只接合理、合法、正规用途的需求,不接违法、违规、恶意攻击类项目。有需要的朋友可以直接留言。加了我微信后,我会自动发送一些自动回复,如有打扰,请忽略即可。那个都是我的微信,绝对是真人,你给我正常发消息即可,必回!
大家在学习过程中如果有遇到问题,欢迎随时联系我解决(我的vx:2584914241),应粉丝要求,我创建了一些高质量的Python学习交流群和付费接单群,欢迎大家加入我的Python学习交流群和接单群。

------------------- End -------------------
往期精彩文章推荐:

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持
想加入Python学习群请在后台回复【入群】
万水千山总是情,点个【在看】行不行