一份用pyhon生成word/wps文档的代码2

news/2025/11/12 17:22:22/文章来源:https://www.cnblogs.com/wangya216/p/19214809

import os, pythoncom, win32com.client as win32

---------------------- 工具函数 ----------------------

def get_or_add_style(doc, name):
try:
return doc.Styles(name)
except:
return doc.Styles.Add(Name=name, Type=1) # 1=段落样式

---------------------- 主程序 ----------------------

pythoncom.CoInitialize()
try:
app = win32.Dispatch("Word.Application")
except:
app = win32.Dispatch("Kwps.Application")
app.Visible = True
doc = app.Documents.Add()

Word 常数

wdCollapseEnd = 0
wdStory = 6
wdWord9TableBehavior = 1
wdAutoFitContent = 1
wdFormatDocumentDefault = 12

---------- 1. 建立样式 ----------

def make_styles():
# 实验标题
s = get_or_add_style(doc, "濮工_实验标题")
s.Font.NameFarEast = s.Font.Name = "黑体"
s.Font.Size = 18
s.Font.Bold = True
pf = s.ParagraphFormat
pf.Alignment = 1 # 居中
pf.SpaceBefore = 18
pf.SpaceAfter = 12
pf.LineSpacingRule = 0 # 单倍

# 一级标题
s = get_or_add_style(doc, "濮工_一级标题")
s.Font.NameFarEast = s.Font.Name = "黑体"
s.Font.Size = 14
s.Font.Bold = True
pf = s.ParagraphFormat
pf.Alignment = 0
pf.SpaceBefore = 12
pf.SpaceAfter = 6
pf.LineSpacingRule = 0# 二级标题
s = get_or_add_style(doc, "濮工_二级标题")
s.Font.NameFarEast = s.Font.Name = "黑体"
s.Font.Size = 12
s.Font.Bold = True
pf = s.ParagraphFormat
pf.Alignment = 0
pf.SpaceBefore = 6
pf.SpaceAfter = 3
pf.LineSpacingRule = 0# 正文
s = get_or_add_style(doc, "濮工_正文")
s.Font.NameFarEast = s.Font.Name = "宋体"
s.Font.Size = 10.5
pf = s.ParagraphFormat
pf.FirstLineIndent = app.CentimetersToPoints(0.74)  # 2 字符
pf.LineSpacingRule = 3      # 多倍
pf.LineSpacing = 1.25       # 1.25 倍
pf.Alignment = 0            # 默认居左# 图题注
s = get_or_add_style(doc, "濮工_图题注")
s.Font.NameFarEast = s.Font.Name = "宋体"
s.Font.Size = 9
pf = s.ParagraphFormat
pf.Alignment = 1
pf.SpaceAfter = 6
pf.LineSpacingRule = 0# 表题注
s = get_or_add_style(doc, "濮工_表题注")
s.Font.NameFarEast = s.Font.Name = "宋体"
s.Font.Size = 9
pf = s.ParagraphFormat
pf.Alignment = 1
pf.SpaceBefore = 6
pf.LineSpacingRule = 0

make_styles()

---------- 2. 顺序写内容 ----------

rng = doc.Range()
rng.Collapse(wdCollapseEnd)

def write(style, text, newline=True):
rng.Style = style
rng.Text = text
if newline:
rng.InsertParagraphAfter()
rng.Collapse(wdCollapseEnd)

标题

write(doc.Styles("濮工_实验标题"), "实验14 Python变量的内存模型")

一、实验目的

write(doc.Styles("濮工_一级标题"), "一、实验目的")
for t in ["1. 理解Python变量的“引用机制”,明确“变量名-引用-对象”的三层关系;",
"2. 掌握整数、字符串、列表等不同类型变量的内存分配规则(不可变/可变对象差异);",
"3. 观察Python垃圾回收机制(引用计数为0时对象销毁),理解del语句的作用;",
"4. 学会使用id()、sys.getrefcount()工具函数分析变量内存地址与引用计数;",
"5. 能通过实验现象区分浅拷贝与深拷贝的内存差异,解决实际编程中的内存问题。"]:
write(doc.Styles("濮工_正文"), t)

二、实验仪器

write(doc.Styles("濮工_一级标题"), "二、实验仪器")
for t in ["1. 硬件:带Python环境的计算机(Windows/macOS/Linux均可,内存≥4GB);",
"2. 软件:Python 3.8及以上版本、PyCharm/VS Code(含代码运行与调试功能);",
"3. 辅助工具:sys模块(获取引用计数)、copy模块(浅拷贝/深拷贝)、idle3终端;",
"4. 辅助资料:Python官方文档(数据模型章节)、内存地址可视化工具(可选)。"]:
write(doc.Styles("濮工_正文"), t)
write(doc.Styles("濮工_图题注"), "图14-1 Python变量内存模型示意图")

三、实验原理

write(doc.Styles("濮工_一级标题"), "三、实验原理")
write(doc.Styles("濮工_二级标题"), "1. Python变量的内存本质")
write(doc.Styles("濮工_正文"), "Python中变量本质是“引用”(内存地址指针),变量名存储在栈内存,指向堆内存中的对象(数据本体)。例如:a = 10中,a是栈中的引用,指向堆中值为10的整数对象,而非变量a直接存储10。")

write(doc.Styles("濮工_二级标题"), "2. 不可变与可变对象的内存差异")
write(doc.Styles("濮工_正文"), "不可变对象(int、str、tuple):对象创建后值不可修改,赋值操作会生成新对象并更新引用(如a = 10; a += 5,会创建新对象15,a指向新地址);")
write(doc.Styles("濮工_正文"), "可变对象(list、dict、set):对象值可修改,赋值操作不生成新对象,仅修改堆中数据(如lst = [1,2]; lst.append(3),lst引用地址不变)。")

write(doc.Styles("濮工_二级标题"), "3. 引用计数与垃圾回收")
write(doc.Styles("濮工_正文"), "每个Python对象都有引用计数器,记录当前指向该对象的引用个数(sys.getrefcount()可获取)。当引用计数为0时,对象占用的堆内存会被垃圾回收机制自动释放,避免内存泄漏。")

write(doc.Styles("濮工_二级标题"), "4. 核心公式(引用计数变化)")
write(doc.Styles("濮工_正文"), "对象引用计数变化遵循以下规则:")

公式段居中

formula_rng = rng.Duplicate
formula_rng.Style = doc.Styles("濮工_正文")
formula_rng.ParagraphFormat.Alignment = 1
formula_rng.Text = "新引用创建:count += 1;引用销毁:count -= 1;count = 0 → 对象销毁 ①"
formula_rng.InsertParagraphAfter()

光标恢复居左

rng.MoveEnd(Unit=wdStory)
rng.Collapse(wdCollapseEnd)
rng.ParagraphFormat.Alignment = 0

write(doc.Styles("濮工_正文"), "式中count为对象的引用计数,新变量赋值、函数传参等操作会增加计数;del语句、变量重赋值、函数执行结束等会减少计数。")

四、实验内容及步骤

write(doc.Styles("濮工_一级标题"), "四、实验内容及步骤")
write(doc.Styles("濮工_二级标题"), "1. 实验前准备")
for t in ["(1)环境配置:确认Python环境正常,安装PyCharm/VS Code,导入必要模块(import sys, copy);",
"(2)工具熟悉:在终端中测试id()函数(返回对象内存地址)、sys.getrefcount()函数(返回引用计数,自身调用会+1);",
"(3)创建实验目录:新建“Python内存模型实验”文件夹,保存实验代码文件(命名为test_memory.py)。"]:
write(doc.Styles("濮工_正文"), t)

write(doc.Styles("濮工_二级标题"), "2. 实验任务1:不可变对象的内存分配")
write(doc.Styles("濮工_正文"), "(1)编写代码,观察整数变量的内存地址变化:")
write(doc.Styles("濮工_正文"), "a = 10\nb = 10\nprint("a的地址:", id(a))\nprint("b的地址:", id(b))\nprint("a的引用计数:", sys.getrefcount(a))")
write(doc.Styles("濮工_正文"), "(2)运行代码,记录a和b的地址是否相同(验证小整数池缓存机制);")
write(doc.Styles("濮工_正文"), "(3)修改代码为a = 257; b = 257,再次运行,观察地址是否仍相同(验证大整数不缓存)。")

write(doc.Styles("濮工_二级标题"), "3. 实验任务2:可变对象的内存分配")
write(doc.Styles("濮工_正文"), "(1)编写代码,观察列表变量的内存变化:")
write(doc.Styles("濮工_正文"), "lst1 = [1,2,3]\nlst2 = lst1\nlst2.append(4)\nprint("lst1的地址:", id(lst1))\nprint("lst2的地址:", id(lst2))\nprint("lst1的值:", lst1)")
write(doc.Styles("濮工_正文"), "(2)运行代码,分析lst1和lst2地址相同的原因,以及lst1值变化的本质;")
write(doc.Styles("濮工_正文"), "(3)添加lst3 = copy.copy(lst1),观察lst3与lst1的地址差异(浅拷贝)。")

write(doc.Styles("濮工_二级标题"), "4. 实验任务3:引用计数与垃圾回收")
write(doc.Styles("濮工_正文"), "(1)编写代码,跟踪引用计数变化:")
write(doc.Styles("濮工_正文"), "import sys\nc = "hello"\nprint("初始引用计数:", sys.getrefcount(c))\nd = c\nprint("赋值后引用计数:", sys.getrefcount(c))\ndel d\nprint("删除d后引用计数:", sys.getrefcount(c))")
write(doc.Styles("濮工_正文"), "(2)运行代码,记录各步骤引用计数变化,理解del语句的作用;")
write(doc.Styles("濮工_正文"), "(3)通过任务管理器观察Python进程内存占用,分析垃圾回收是否释放内存。")

五、数据及处理结果

write(doc.Styles("濮工_一级标题"), "五、数据及处理结果")
write(doc.Styles("濮工_表题注"), "表14-1 不可变对象内存分配实验数据")

插入表格1

table_rng1 = rng.Duplicate
table1 = doc.Tables.Add(table_rng1, 4, 4, AutoFitBehavior=wdAutoFitContent)
table1.Borders.Enable = True

表头1

hdr1 = ["变量赋值语句", "内存地址(十进制)", "引用计数", "实验结论(地址是否相同)"]
for i, h in enumerate(hdr1, 1):
table1.Cell(1, i).Range.Text = h

数据1

rows1 = [["a=10; b=10", "", "", ""],
["a=257; b=257", "", "", ""],
["a="abc"; b="abc"", "", "", ""]]
for r, row_data in enumerate(rows1, 2):
for c, txt in enumerate(row_data, 1):
table1.Cell(r, c).Range.Text = txt

居中

for r in range(1, 5):
for c in range(1, 5):
table1.Cell(r, c).Range.ParagraphFormat.Alignment = 1

光标移到表格下方

app.Selection.EndKey(Unit=wdStory)
app.Selection.InsertParagraphAfter()
rng = app.Selection.Range

write(doc.Styles("濮工_表题注"), "表14-2 可变对象内存分配实验数据")

插入表格2

table_rng2 = rng.Duplicate
table2 = doc.Tables.Add(table_rng2, 4, 4, AutoFitBehavior=wdAutoFitContent)
table2.Borders.Enable = True

表头2

hdr2 = ["变量操作", "lst1地址", "lst2地址", "lst1最终值"]
for i, h in enumerate(hdr2, 1):
table2.Cell(1, i).Range.Text = h

数据2

rows2 = [["lst1=[1,2,3]; lst2=lst1", "", "", ""],
["lst2.append(4)", "", "", ""],
["lst3=copy.copy(lst1)", "", "", ""]]
for r, row_data in enumerate(rows2, 2):
for c, txt in enumerate(row_data, 1):
table2.Cell(r, c).Range.Text = txt

居中

for r in range(1, 5):
for c in range(1, 5):
table2.Cell(r, c).Range.ParagraphFormat.Alignment = 1

光标移到表格下方

app.Selection.EndKey(Unit=wdStory)
app.Selection.InsertParagraphAfter()
rng = app.Selection.Range

write(doc.Styles("濮工_正文"), "数据处理与分析:")
write(doc.Styles("濮工_正文"), "1. 对比表14-1数据,总结小整数池(-5~256)的缓存规则,解释地址相同/不同的原因;")
write(doc.Styles("濮工_正文"), "2. 结合表14-2数据,说明可变对象“多引用指向同一对象”的特性,以及浅拷贝对内存地址的影响;")
write(doc.Styles("濮工_正文"), "3. 分析引用计数变化规律,验证“del语句删除引用而非对象”的结论。")

六、思考题

write(doc.Styles("濮工_一级标题"), "六、思考题")
for t in ["1. 为什么Python中a = 10; b = a; a += 5后,b的值仍为10,而lst1 = [1,2]; lst2 = lst1; lst1.append(3)后,lst2的值变为[1,2,3]?从内存模型角度解释。",
"2. 当执行a = None时,原a指向的对象引用计数会如何变化?None在Python内存中有什么特殊意义?",
"3. 浅拷贝(copy.copy)和深拷贝(copy.deepcopy)在处理嵌套列表(如lst = [1, [2,3]])时,内存分配有何差异?请设计实验验证。",
"4. Python的垃圾回收机制除了引用计数,还有标记-清除、分代回收等策略,查阅资料说明这些策略的作用(针对循环引用问题)。"]:
write(doc.Styles("濮工_正文"), t)

---------- 保存 ----------

save_path = os.path.join(os.path.expanduser("~"), "Desktop", "Python变量的内存模型实验讲义.docx")
doc.SaveAs(save_path, FileFormat=wdFormatDocumentDefault)
print("已生成:", save_path)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/963625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

200粉粉福

博客园评论 和 luogu私信 均可 Q&A(询问与回答)

【chrome】chrome浏览器OptGuideOnDeviceModel模型占用磁盘空间的解决方法!

解决方法: 1、在浏览器依次输入以下内容并回车,在结果页面修改状态为关闭 chrome://flags/#prompt-api-for-gemini-nanochrome://flags/#optimization-guide-on-device-model2、删除该文件所属目录OptGuideOnDeviceM…

这样的算作“全栈技术”吗?

一、前端 1、vue3开发web端,并生成build包,加生产配置,开发后台管理系统,包括用户管理、系统管理、系统详情、内存、cpu、磁盘、数据看板 2、vue3 +uniapp开发手机端 二、后端 1、python开发后端webapi接口 2、nod…

2025-11-12 aoao Round2 赛后总结

T1 空 题意 给定一个排列 \(p\) 和一个数 \(b\),求这个排列有多少长度为奇数的子段的中位数是 \(b\)。 赛时 观察性质。 题解 考虑把排列中大于 \(b\) 的数变成 \(1\),小于 \(p\) 的数变成 \(-1\)。 所以做个前缀和,…

商丘西林瓶灌装线:人员更替需再培训?费用明晰

在制药与生物制剂行业,西林瓶灌装设备的操作人员流动性问题日益受到关注。尤其当熟悉流程的技术人员离职后,新接手人员是否需要重新培训、二次培训成本如何控制,成为企业采购决策中的关键考量因素之一。面对这一现实…

vue3+ts实现页面滚动位置的保存及恢复

vue3+ts实现页面滚动位置的保存及恢复前言: 折腾了n个小时才搞定,这个在vue2中不显眼的功能到了vue3中没想到成为了拦路虎。借助于AI一遍一遍的尝试各种方案,最终敲定了路由scrollBehavior保存组件滚动位置到pinia,…

SAP屏幕增强自定义界面字段使用自定义搜索帮助方法

背景:在比如采购订单、销售订单屏幕界面,做了自定义字段,里面要选择一些底表的数据显示。 1、直接使用系统标准的搜索帮助。 假设我们已经有底表数据ZTCMS002,SE11建立搜索帮助. 进到屏幕界面,点击布局 双击字段,…

南大-操作系统-绿导师原谅你了

现在在看的视频: 操作系统上的程序 (什么是程序和编译器) [南京大学2022操作系统-P2] 1. 缘起 事情起因是在学习youtube上benEater的制作cpu的视频,然后在b站上搜索有没有人做过搬运或者中文翻译的视频。 B站搜索后找…

昌都西林瓶粉末灌装机:远程可控,手机电脑轻松操作

在制药、生物试剂及精细化工等行业,西林瓶灌装设备的选型常面临多重挑战:一方面,用户对灌装精度、洁净等级、自动化程度等核心参数理解不足;另一方面,市场产品种类繁杂,功能描述模糊,导致需求与设备实际能力错配…

深入解析:EI会议预订又又+1

深入解析:EI会议预订又又+12025-11-12 17:07 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

牛B, 我去,新手小白也能使用InfiniteTalk搭建属于自己的数字人啦 ,真的太简单啦!!!

嗨,我是小华同学,专注解锁高效工作与前沿AI工具!每日精选开源技术、实战技巧,助你省时50%、领先他人一步。👉免费订阅,与10万+技术人共享升级秘籍!数字人视频制作最难的是两点:口型要准、全身/表情要自然一致…

QCombox判断是否包含某项

在 Qt 中,判断 QComboBox 是否包含某项有几种方法。以下是详细的解决方案: 方法一:使用 findText() 函数(最常用) #include <QComboBox>// 判断是否包含文本项 QComboBox *comboBox = new QComboBox(this);…

植物大战僵尸2下载教程:延续经典塔防,体验全新时空冒险

前言: 十多年前,一款小巧却极具创意的塔防游戏——《植物大战僵尸》,几乎成为每一代电脑玩家的共同记忆。它以简洁画风、紧凑节奏和独特策略设计,奠定了塔防类游戏的经典地位。 如今,这个系列迎来了更具规模和深度…

阳江西林瓶灌装加塞机:多品牌如何选?看这几点

在当前制药与生物制剂设备采购市场中,阳江地区的中小型药企及科研机构对西林瓶灌装设备的需求持续增长。据2024年行业调研数据显示,用户在选购西林瓶灌装机时,核心关注点依次为:设备稳定性(占比38%)、灌装精度(…

JavaWeb05-Web基础

JavaWeb05-Web基础Web基础1.SpringBoot Spring官网:spring.ioSpring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能。Spring Boot可以帮助我们非常快速的构建应用程序、…

CF125E MST Company

按照和 P2619 一样的方法,将连有 \(1\) 的边看作白边,其他边为黑边,随便 WQS 二分一下即可。

Git分支合并

在开发中,我们需要独立的分支进行独立开发,开发测试完之后没问题,往master合并的操作 Git分支合并(别的分支合并到master)bash # 切换到 master 分支 git checkout master# 从远程拉取最新的 master 分支代码(如…

西林瓶灌装机质

在制药、生物试剂及精细化工等行业,设备选型常面临需求与产品错配、技术参数混乱、售后响应滞后等核心痛点。尤其针对西林瓶灌装机这类高精度设备,一旦出现质量问题,不仅影响生产效率,更可能造成整批产品报废。因此…

基于Newmark-β法的单自由度体系地震响应MATLAB实现

基于Newmark-β法的单自由度体系地震响应MATLAB实现一、算法原理与公式 单自由度体系运动方程:Newmark-β法递推公式:预测步:校正步:二、MATLAB核心代码实现 function [time, disp, vel, acc] = Newmark_SDOF(m, c…

无监督学习驱动的遗留系统重构专业的方法论

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …