第1节:os模块
Python 的 os 模块就像是你的“物业管理员”或者是“私人管家”,不管你想查谁的户口(路径),还是想盖房、拆房(创建、删除目录),它都能帮你搞定。
咱们这就来一场说走就走的“文件探险”,代码管够,废话不多说,直接上车!
1. 路径操作:别让你的文件迷路
os.path 是这个模块里的“GPS导航仪”。它可以帮你处理不同系统(Windows 或 Linux)那让人头秃的斜杠差异。
import os
# 1. 获取当前你家(工作目录)在哪
current_home = os.getcwd()
print(f"🏠 当前物业位置:{current_home}")
# 2. 强行搭讪:拼接路径 (os.path.join)
# 别再用 '+' 拼路径了,万一斜杠反了会出事的!
folder = "我的秘密基地"
file = "藏宝图.txt"
path = os.path.join(current_home, folder, file)
print(f"📍 宝藏地址:{path}")
# 3. 拆散这对新人 (os.path.split)
# 把路径拆成:文件夹路径 + 文件名
directory, filename = os.path.split(path)
print(f"📂 它的宿舍:{directory}\n📄 它的名字:{filename}")
# 4. 只想要个后缀 (os.path.splitext)
# 看看它是正经文件还是病毒
name, extension = os.path.splitext(file)
print(f"🆔 文件名:{name}, 🏷️ 格式:{extension}")
2. 判断:它是真实存在的吗?
在对文件下手之前,先确认它是不是幻觉,否则 Python 报错的脾气可不好。
# 1. 它是真实存在的吗? (os.path.exists)
is_real = os.path.exists("前任的照片.jpg")
if not is_real:
print("💔 早就删干净了,别看了。")
# 2. 它是“人”还是“房子”? (os.path.isfile / isdir)
if os.path.isfile(path):
print("📄 报告!这是一个正经的文件。")
elif os.path.isdir(current_home):
print("🏢 报告!这是一个宽敞的目录(文件夹)。")
3. 批量获取列表:查看你的“后宫”
如果你想知道一个文件夹里到底塞了多少奇奇怪怪的东西,这一招必学。
# 1. 粗略查看 (os.listdir)
# 只看当前层,不往深处挖
stuff = os.listdir(os.getcwd())
print(f"👀 看看这层都有啥:{stuff}")
# 2. 深度挖掘 (os.walk) —— 这是个“神技”
# 它会像土拨鼠一样,把所有子文件夹和文件都翻出来
print("🕳️ 开始全城搜捕...")
for root, dirs, files in os.walk("."):
for name in files:
print(f"🔍 躲在 {root} 里的文件:{name}")
4. 盖房与拆迁:目录创建与删除
这是最刺激的部分,请谨慎操作,毕竟“误删”是每个程序员的噩梦。
# 1. 盖一间单间 (os.mkdir)
# ⚠️ 注意:如果父文件夹不存在,它会罢工
try:
os.mkdir("新出的瓜")
print("🍉 瓜棚搭好了。")
except FileExistsError:
print("🙄 瓜棚早就有了,别盖了。")
# 2. 盖一座摩天大楼 (os.makedirs)
# 哪怕中间的文件夹都没有,它也会自动帮你全部建好(非常给力!)
os.makedirs("2024/计划/又要/咕咕咕", exist_ok=True)
print("🏢 连环套娃文件夹建好了。")
# 3. 拆迁 (os.rmdir / os.remove)
# 注意:os.rmdir 只能删空文件夹,里面有东西它不敢拆
try:
os.rmdir("新出的瓜")
print("🧹 瓜吃完了,棚子拆了。")
except OSError:
print("😱 棚子里还有东西,拆不动!")
总结小抄表
| 功能 | 命令 | 备注 |
|---|---|---|
| 拿当前位置 | os.getcwd() | “我在哪?” |
| 拼路径 | os.path.join() | 跨系统自动处理斜杠,稳! |
| 查户口 | os.path.exists() | 看看东西还在不在。 |
| 大扫除 | os.walk() | 文件夹里的所有东西无所遁形。 |
| 建房 | os.makedirs() | 建议带上 exist_ok=True,省心。 |
温馨提示:在用 os 模块进行大规模删除操作前,请务必对着镜子问问自己:“我备份了吗?” 祝你玩得开心!
第2节:shutil模块
手动拖拽文件夹是种“体力劳动”,准备让 Python 替你当这个“文件搬运工”了。
shutil(Shell Utilities)模块就是 Python 里的那个超级管家。它不仅能搬东西,还能打包、拆包,甚至能帮你毁尸灭迹(误)。
准备好了吗?我们要开始对你的硬盘“动手动脚”了。
1. 复制:影分身之术
复制文件或目录。shutil 有好几种姿势,取决于你想要多“还原”。
场景:把你的“学习资料”备份一份
import shutil
import os
# 1. shutil.copy(src, dst): 复制内容和权限,但不包括元数据(比如创建时间)
# 就像克隆了一个你,但这个克隆人没有你的记忆。
shutil.copy('学习资料.mp4', '备份/学习资料_副本.mp4')
# 2. shutil.copy2(src, dst): 连同元数据一起复制(最推荐,最像原版)
# 连你昨天熬夜留下的黑眼圈(创建时间)都一模一样。
shutil.copy2('秘密笔记.txt', '保险箱/秘密笔记_备份.txt')
# 3. 整个文件夹搬走:shutil.copytree
# 哪怕文件夹里有十八层地狱(子文件夹),它也能全给你搬过去。
if not os.path.exists('远程服务器/重要项目'):
shutil.copytree('本地项目', '远程服务器/重要项目')
print("全家桶搬迁完毕!")
2. 移动与重命名:瞬移大法
shutil.move 是最常用的功能。它不仅能换地方,还能顺便改名。
场景:把前任的照片丢进回收站,顺便改名叫“那个谁”
# 如果目标路径和源路径在同一个磁盘,这就是重命名;
# 如果不在,它会先复制再删除原文件,深藏功与名。
shutil.move('前任/美照.jpg', '垃圾桶/那个谁.jpg')
print("瞬间移动完成,眼不见心不烦。")
3. 删除:毁尸灭迹(慎用!)
os.remove 只能删单个文件,而 shutil.rmtree 能直接抹掉整个文件夹。
场景:老板说项目黄了,让你删掉所有代码
# 警告:这个操作不进回收站,直接从物理层面抹除!
# 请在按下回车前深呼吸三次。
try:
shutil.rmtree('倒霉项目_v1.0')
print("报告老板,证据……啊不,项目已销毁!")
except FileNotFoundError:
print("早删过了,别催了。")
4. 自动分类归档:乱室佳人变洁癖大师
这是 shutil 结合 os 的高级玩法。我们可以根据文件后缀名,把乱糟糟的桌面自动分好类。
场景:拯救你那堆满了 500 个文件的桌面
import os
import shutil
def tidy_up_my_mess(folder_path):
# 定义分类规则:格式 -> 文件夹名
rules = {
'图片': ['.jpg', '.png', '.gif', '.jpeg'],
'视频': ['.mp4', '.mkv', '.mov'],
'文档': ['.pdf', '.docx', '.txt', '.xlsx'],
'压缩包': ['.zip', '.rar', '.7z']
}
for file in os.listdir(folder_path):
# 别把自己给搬走了
file_path = os.path.join(folder_path, file)
if os.path.isdir(file_path):
continue
# 获取后缀名
_, ext = os.path.splitext(file)
# 开始匹配规则
moved = False
for folder_name, extensions in rules.items():
if ext.lower() in extensions:
target_dir = os.path.join(folder_path, folder_name)
# 文件夹不在就建一个
os.makedirs(target_dir, exist_ok=True)
# 移驾!
shutil.move(file_path, os.path.join(target_dir, file))
print(f"已将 {file} 请入 {folder_name} 宫。")
moved = True
break
if not moved:
print(f"{file} 身份不明,暂留原地。")
# 运行它,你的桌面瞬间变干净!
# tidy_up_my_mess('C:/Users/Administrator/Desktop')
5. 压缩与解压:全家桶打包
以前你还得下个 WinRAR,现在 Python 一行代码搞定。
场景:要把一堆代码发给甲方,但不想让他看清目录结构
# 1. 压缩:make_archive(文件名, 格式, 路径)
# 格式支持 'zip', 'tar', 'gztar' 等
shutil.make_archive('交付件_死也不改版', 'zip', '项目源码/')
# 2. 解压:unpack_archive(压缩包路径, 解压到哪)
shutil.unpack_archive('甲方给的需求.zip', '需求文档/')
print("打包解压一条龙,轻松愉快。")
总结:超级管家的“避坑”指南
| 函数 | 功能 | 相当于 | 备注 |
|---|---|---|---|
| copy2 | 复制文件 | 完美克隆 | 连时间戳都留着,最建议用 |
| copytree | 复制文件夹 | 搬家 | 目标文件夹必须不存在,否则报错 |
| move | 移动/重命名 | 瞬移/整容 | 跨磁盘时速度较慢 |
| rmtree | 删除文件夹 | 降维打击 | 极其危险,没有后悔药 |
| make_archive | 压缩 | 打包快递 | 简单粗暴好用 |
你学会了吗?
第3节:python-docx基础:
准备好把那些枯燥的 .docx 文档变成你的代码“玩物”了。没问题,咱们今天就用 python-docx 搞定这些文档。
先确认你已经安装了这个库,如果没有,赶紧去终端(Terminal)执行:
pip install python-docx
1. 文档的“开天辟地”:创建与打开
就像写日记一样,你得先找本本。Document() 就是你的新本子。
from docx import Document
# 情况 A:凭空变出一个新文档(就像变魔术,此时还在内存里)
doc = Document()
# 情况 B:打开一个现成的文档(像是在垃圾堆里翻到前任的情书)
# doc = Document('ex_girlfriend_letter.docx')
print("文档已就绪,准备开始整活!")
2. 段落(Paragraph):文档的灵魂肉体
段落是 Word 的基础。我们可以写一段话,也可以往里面疯狂加戏。
# 添加一个普通段落
p1 = doc.add_paragraph("这是一段正经的文字。")
# 想在一段话里玩花活?用 add_run()
# run 就像是段落里的“变色龙”,可以单独改格式
p2 = doc.add_paragraph("我是个段落,但我里面的词有")
run = p2.add_run(" 性格 ")
run.bold = True # 加粗:我很强壮!
run.italic = True # 倾斜:我很优雅~
p2.add_run(",还有个")
p2.add_run("红色高亮").font.name = 'Arial' # 换个字体
#
3. 标题(Heading):撑起门面的大梁
标题有级别,level=0 是文档总标题,1-9 是各级小标题。
doc.add_heading('震惊!Python 竟然能自动写文档', level=0) # 最大标题
doc.add_heading('第一章:如何优雅地摸鱼', level=1)
doc.add_heading('1.1 摸鱼的哲学', level=2)
4. 表格(Table):让数据排排坐
表格稍微复杂点,你需要指定行(Row)和列(Col)。
# 创建一个 3行 3列 的表格 table = doc.add_table(rows=3, cols=3) table.style = 'Table Grid' # 加上边框,不然看不见 # 获取第一行并填入表头 hdr_cells = table.rows[0].cells
hdr_cells[0].text = '姓名'
hdr_cells[1].text = '战斗力'
hdr_cells[2].text = '口头禅'
# 填入数据
row_cells = table.rows[1].cells
row_cells[0].text = '程序员 A'
row_cells[1].text = '5'
row_cells[2].text = '我本地运行没问题啊!'
# 循环读取表格内容(看看刚才写了啥)
for row in table.rows:
for cell in row.cells:
print(f"格子里写着:{cell.text}")
5. 读取内容:反向侦查
如果你是想读别人的文档,方法也很简单。
# 读一段
for i, para in enumerate(doc.paragraphs):
print(f"第 {i} 段的内容是: {para.text}")
# 读表格(双重循环,像剥洋葱)
for table in doc.tables:
for row in table.rows:
row_data = [cell.text for cell in row.cells]
print("发现一行数据:", " | ".join(row_data))
6. 毁尸灭迹(保存文档)
如果你不保存,刚才的一切就像你昨晚吹的牛一样,醒来全没了。
doc.save('我的自动化杰作.docx')
print("保存成功!快去文件夹里膜拜它吧。")
| 功能 | 方法 | 备注 |
|---|---|---|
| 创建/打开 | Document('path.docx') | 留空则创建新的 |
| 加标题 | add_heading('文本', level=1) | Level 0 是大标题 |
| 加段落 | add_paragraph('文本') | 返回一个 Paragraph 对象 |
| 改样式 | run = p.add_run('文本') | 只有 Run 能改粗体/斜体/字体 |
| 加表格 | add_table(rows, cols) | 记得设 style='Table Grid' |
避坑指南:
单位问题:如果你要设置图片大小或页边距,记得导入 from docx.shared import Inches 或 Pt。
样式名称:table.style = 'Table Grid' 是常用的,如果不写这个,你的表格在 Word 里看起来就是“裸奔”的(没有边框线)。
第4节:模板替换
在 Python 的世界里,批量把变量塞进模板就像是在玩“填词游戏”。不管你是要给前任发群发道歉信,还是给债主们发催款通知,掌握这几种姿势能让你事半功倍。
以下是 Python 中模板替换的“全家桶”指南:
1. 远古时代的遗产:% 运算符
这是最老派的做法,像极了还在用诺基亚的年代。虽然老,但在一些老旧代码库里你还能见到它。
特点:语法有点怪,容易写错位置。
搞笑场景:发错工资时的紧急通知。
# 核心语法: "模板" % (变量1, 变量2)
template = "尊敬的 %s:由于财务小王摸鱼,您的本月工资实发 %.2f 元,剩下的以 %d 个鸡蛋抵扣。"
# 批量填充
data = [("张三", 50.5, 100), ("李四", 0.01, 999)]
for name, money, eggs in data:
print(template % (name, money, eggs))
2. 优雅的进阶:.format() 方法
这是 Python 2.6 引入的,目前依然非常主流。它比 % 灵活得多,支持按顺序、按名称、甚至按对象的属性填充。
特点:大括号 {} 是灵魂,支持“一词多用”。
搞笑场景:渣男/渣女的群发情人节模版。
# 1. 按顺序填
print("亲爱的{},其实我最爱的是{}。".format("小芳", "你"))
# 2. 按编号填(防止记错名字)
template = "亲爱的 {0}:其实我最爱的是 {0},{1} 只是我的普通朋友。"
print(template.format("翠花", "二狗子"))
# 3. 按关键字填(最推荐,不容易乱)
template = "【外卖提醒】{name}你好!由于你的外卖被{villain}偷走了,我们将赔偿你一张{discount}折券。"
print(template.format(name="大壮", villain="隔壁老王", discount=0.5))
3. 现代艺术:F-strings (变色龙模式)
Python 3.6+ 的神作。直接把变量写在大括号里,代码看起来就像魔法一样。
特点:速度最快,可读性最高,支持在里面写简单的逻辑。
搞笑场景:修仙选手的个人简介。
level = 99
name = "铁柱"
is_rich = False
# 直接在字符串里玩花样
intro = f"我是{name},目前练气第{level}层。{'家产万贯' if is_rich else '穷得叮当响'}。"
print(intro)
# 甚至可以处理日期和金额格式化
from datetime import datetime
today = datetime.now()
balance = 1234567.89
print(f"日期:{today:%Y年%m月%d日},您的账户余额:¥{balance:,.2f}")
# 输出:日期:2026年04月29日,您的账户余额:¥1,234,567.89
4. 安全第一:string.Template
如果你要处理的用户输入(比如网页表格填进来的东西),用上面几种可能会有安全风险(格式字符串攻击)。这时候得请出“安全管家”。
特点:使用 $ 符号,语法非常类似 Shell 脚本。
搞笑场景:匿名勒索信(误)。
from string import Template
# 定义模版,用 $ 标识占位符
s = Template("由于你偷了 ${target} 的 ${item},请于 ${time} 前自首!")
# 批量替换
mapping = {
"target": "食堂大妈",
"item": "不锈钢大勺",
"time": "下班前"
}
print(s.substitute(mapping))
5. 暴力流:.replace()
如果你完全不想记语法,只想简单粗暴地替换,那就直接用字符串自带的方法。
特点:简单但不智能,容易误伤(比如把“张三”换了,结果“张三丰”也变了)。
text = "你好 [NAME],你的验证码是 [CODE]。"
print(text.replace("[NAME]", "旺财").replace("[CODE]", "9527"))
6. 终极奥义:Jinja2 (专业级)
如果你要生成的东西非常复杂(比如一整个 HTML 页面或者长篇报告),上面的工具就捉襟见肘了。Jinja2 是 Python 最火的模版引擎。
特点:支持循环(if/for)、继承,功能强到离谱。
场景:自动生成公司的“甩锅公告”。
# 需要 pip install jinja2
from jinja2 import Template
j2_template = Template("""
致全体员工:
关于本次 {{ project_name }} 的失败,原因如下:
{% for reason in reasons %}
- {{ loop.index }}. {{ reason }}
{% endfor %}
结论:全是 {{ scapegoat }} 的错!
""")
data = {
"project_name": "拯救地球计划",
"reasons": ["PPT做得太丑", "老板昨晚失眠", "水星逆行"],
"scapegoat": "实习生小明"
}
print(j2_template.render(data))
总结:该选哪一个?
| 方案 | 推荐指数 | 适用场景 |
|---|---|---|
| F-strings | ⭐⭐⭐⭐⭐ | 首选! 日常开发、日志、简单替换。 |
| .format() | ⭐⭐⭐⭐ | 需要复用占位符,或在 Python 3.6 以下版本。 |
| string.Template | ⭐⭐⭐ | 处理不信任的用户输入。 |
| Jinja2 | ⭐⭐⭐⭐ | 生成复杂的 HTML、邮件模板或配置文件。 |
| % 运算符 | ⭐ | 除非你在修文物的代码。 |
你要用这些模版去“批量填充”什么样的搞笑内容?我可以帮你写个更具体的循环逻辑!
第5节:批量生成文档
要把 Excel 里的“花名册”变成 Word 里的“委任状”或“检讨书”,这种活儿要是手动做,简直是程序员的职业耻辱。
在 Python 界,处理这种任务的“黄金搭档”通常是 pandas(负责读 Excel)和 python-docx(负责写 Word)。
准备工作:
pip install pandas openpyxl python-docx
1. 基础版:简单粗暴的“克隆术”
场景: 公司的年会抽奖,你要给中奖的同事发通知。Excel 里只有“姓名”和“奖品”。
import pandas as pd
from docx import Document
# 假设 excel 内容:姓名: [张三, 李四], 奖品: [特等奖(脸盆), 一等奖(袜子)]
df = pd.read_excel('awards.xlsx')
for index, row in df.iterrows():
doc = Document()
doc.add_heading('中奖喜报', 0)
# 这里的 row['姓名'] 就像是从 Excel 抽屉里拿东西
p = doc.add_paragraph(f"亲爱的 {row['姓名']} 同志:")
p.add_run(f"\n恭喜你抽中了 {row['奖品']}!")
doc.add_paragraph("请务必在下班前领走,否则奖品将被老板没收。")
# 文件名也要个性化,不然全叫 "新建文档" 就乱套了
doc.save(f"通知_{row['姓名']}.docx")
print("大功告成!全公司都脱贫致富了。")
2. 进阶版:模版替换法(最推荐)
场景: 你有一份排版精美(五彩斑斓)的 Word 模板,里面有各种加粗、下划线。你不想用代码写样式,只想把 {{name}} 换成真名。
这里推荐一个神级库:docxtpl(它是 python-docx 的华丽外壳)。
pip install docxtpl
from docxtpl import DocxTemplate
import pandas as pd
# 1. 加载那个你改了 18 遍的模版
tpl = DocxTemplate("分手信模板.docx")
df = pd.read_excel('breakup_list.xlsx')
for _, row in df.iterrows():
# 2. 准备好要替换的字典,Key 要和 Word 里的 {{Key}} 一一对应
context = {
'name': row['前任姓名'],
'reason': row['分手理由'],
'date': "2023年2月31日"
}
# 3. 渲染并保存
tpl.render(context)
tpl.save(f"再见_{row['前任姓名']}.docx")
print("批量分手完成,下一位更乖。")
3. 深度定制版:带条件的“变色龙”
场景: 根据 Excel 里的绩效评分,生成的文档内容完全不同。优秀的夸出花,差的直接生成辞退信。
from docx import Document
import pandas as pd
df = pd.read_excel('performance.xlsx')
for _, row in df.iterrows():
doc = Document()
score = row['分数']
name = row['姓名']
if score >= 90:
doc.add_heading(f"致:优秀的 {name}", level=1)
doc.add_paragraph("你就是公司的脊梁,老板的贴心小棉袄!")
elif score >= 60:
doc.add_heading(f"致:平凡的 {name}", level=1)
doc.add_paragraph("活着就好,继续努力,别摸鱼了。")
else:
doc.add_heading(f"致:即将自由的 {name}", level=1)
doc.add_paragraph("外面的世界很精彩,祝你在保安行业发光发热。")
doc.save(f"评价_{name}.docx")
4. 极端复杂版:图片也要塞进去
场景: 每个人的文档里不仅有文字,还要根据 Excel 里的路径塞入他们的“丑照”。
from docx import Document
from docx.shared import Inches
import pandas as pd
import os
df = pd.read_excel('staff.xlsx')
for _, row in df.iterrows():
doc = Document()
doc.add_heading(f"特工档案:{row['代号']}", 0)
# 插入图片,Excel 里存的是图片路径,比如 "imgs/shrek.jpg"
img_path = row['照片路径']
if os.path.exists(img_path):
doc.add_picture(img_path, width=Inches(2.0))
else:
doc.add_paragraph("[此处因长相太帅,无法显示]")
doc.add_paragraph(f"主要技能:{row['技能']}")
doc.save(f"档案_{row['代号']}.docx")
避坑小贴士(老司机的眼泪):
路径问题:如果你的 Excel 文件和代码不在一个文件夹,记得用 r"C:\Users\Desktop\file.xlsx" 这种原始字符串,防止反斜杠 \ 闹情绪。
数据类型:Excel 里的日期读出来可能是 Timestamp 对象,直接塞进 Word 会报错。记得用 str(row['日期']) 强行降维打击。
内存管理:如果你要生成 10000 份文档,建议在循环里及时 del doc(虽然 Python 有垃圾回收,但保险起见)。
关闭文件:运行代码前,千万关闭那个正在编辑的 Excel 文件,否则 Python 会提示权限错误,卡到你怀疑人生。
有了这几招,你现在已经是办公室里那个“看起来很忙,其实一直在喝咖啡”的神奇存在了!
💎 动手实战
这个任务在 Python 自动化办公中非常经典。我们就像在办一场“职场选秀”,要把后台的“练习生名单”批量变成正式的“出道通知书”。
我们要用到的核心工具是 python-docx,它能像操纵皮影戏一样控制 Word 文档。
🛠️ 第一步:准备“魔法卷轴”(模板)
首先,你需要创建一个 Word 文档,命名为 template.docx。在文档中,把需要变动的地方用双大括号括起来(就像给文档留出“插座”):
转正通知书
亲爱的 {{name}} 同友:
恭喜你通过了地狱般的 99 轮面试和 3 个月的“带薪搬砖”考察期。鉴于你在公司表现得比 AI 还要卷,我们正式宣布你转正为:{{job}}。
公司将奖励你:{{gift}} 一份!
望你继续发光发热,争取早日实现睡后收入!
--- 宇宙无敌搬砖委员会
🐍 第二步:编写 Python 代码
我们需要安装一个库:pip install python-docx。
import os
from docx import Document
# 1. 我们的“练习生名单”(模拟 100 份数据,这里先写 3 份代表一下)
# 真实场景下,你可以用 openpyxl 读取 Excel 里的 100 个人名
staff_list = [
{"name": "张三", "job": "首席摸鱼官", "gift": "霸王洗发水一瓶"},
{"name": "李四", "job": "资深背锅侠", "gift": "钛合金平底锅"},
{"name": "王五", "job": "高级画饼师", "gift": "超大号圆规(画饼更圆)"},
# ... 假设这里还有 97 个小伙伴
]
def generate_notices(data_list):
# 如果没有存放通知书的文件夹,就新建一个
if not os.path.exists('通知书结果'):
os.makedirs('通知书结果')
for staff in data_list:
# 2. 打开魔法模板
doc = Document('template.docx')
# 3. 遍历文档中的段落,寻找“插座”并接通电源
for paragraph in doc.paragraphs:
for key, value in staff.items():
target_placeholder = f"{{{{{key}}}}}" # 构建成 {{name}} 这种形式
if target_placeholder in paragraph.text:
# 替换内容(就像把插头插进插座)
paragraph.text = paragraph.text.replace(target_placeholder, value)
# 4. 导出成品,文件名要有辨识度,不然老板以为你在发垃圾邮件
file_name = f"通知书结果/转正通知_{staff['name']}.docx"
doc.save(file_name)
print(f"✅ 已为【{staff['name']}】生成专属通知书!")
# 5. 启动魔法仪式
if __name__ == "__main__":
generate_notices(staff_list)
📝 第三步:详细操作步骤(避坑指南)
环境配置:确保你的电脑安装了 Python。在终端输入 pip install python-docx。如果下载慢,可以用清华镜像源。
模板精度:在 Word 模板里写 {{name}} 时,千万不要给这几个字设置不同的字体或颜色(比如 { 是宋体,{name}} 是微软雅黑),这会导致 Word 在底层把这个词拆成多个碎块,Python 就找不到了。
小技巧:建议先在记事本写好 {{name}},再粘贴进 Word。
数据来源:
如果你真的有 100 个人,建议把名单写在 Excel 里。
配合 pandas 或 openpyxl 库读取 Excel,再把每一行变成一个字典 {"name": "xxx", ...} 传给上面的 staff_list 即可。
运行脚本:把代码保存为 main.py,确保它和 template.docx 在同一个文件夹下。运行后,你会看到“通知书结果”文件夹里瞬间冒出 100 个文档。
传统做法:复制、粘贴、改名、保存。手速再快,100 份也得折腾一上午,还容易把张三的薪水发给李四。
Python 做法:代码写完,回车。你还没去接咖啡,100 份文件已经整整齐齐躺在文件夹里了。这就叫“优雅地偷懒”。