《Python趣味工具》——ppt的操作(1)

news2025/1/11 19:43:38

前面我们学习了如何利用turtle模块制作emoji,今天来看看PPT的相关操作:


在这里插入图片描述

文章目录

  • 一、PPT的基础结构:
  • 二、PPT的相关操作:
    • 1. 导入pptx模块
    • 2. ppt的基本操作:
  • 三、总结:
  • 四、 完整源码:


小L想要把 PPT 中的文本全部粘贴到 Word 文档中,该怎么办,一页一页的复制粘贴么,emmm,想想都很麻烦,还是交给Python吧!

即要把 PPT 中的文本内容读取出来,再写入 Word 文档中。

我们想要使用 Python 读取 PPT 中的文字,首先应该清楚 PPT 的基础结构,这样对之后代码的编写很有帮助。

此处我们以 PowerPoint 软件为例,进行讲解和演示。


一、PPT的基础结构:

1️⃣一个 PPT 就是一个演示文稿(Presentation)。

2️⃣演示文稿由页组成,每一页叫做幻灯片页(Slide)。

3️⃣幻灯片页由形状(Shape)组成。

  • PPT 中提供了各种样式的形状,线条、箭头、矩形、基本形状、共识形状等。

4️⃣通过是否含有文本(text),形状可以分为两类:

  • 一类是含有文本框的形状
  • 另一类是无文本框的形状(纯图片)

5️⃣一个文本框可以看作是小的 Word 文档,其中的每一段内容叫段落(Paragraph)。

注意哦,空行也是段落。

段落之中的内容可以具有不同的样式。

  • 常见的样式有:字体、字形、字号、字体颜色、下划线、删除线、上标和下标等。

6️⃣我们把具有相同样式的基本单元可称为一个样式块(Run)。

例如,在段落中有一个高亮的字,那么这个字就形成了一个样式块。字的左右两边被分割成了新的样式块。所以,段落中就有三个样式块。

将 PPT 中的结构按照层级关系来排列是这样的:

幻灯片页 -> 形状 -> 文本框 -> 段落 -> 样式块


二、PPT的相关操作:

1. 导入pptx模块

在了解了 PPT 文件的基础结构后,接下来就要使用 Python 读取内容。

首先,我们要安装 python-pptx 模块,它可以读取和修改 .pptx 文件,不支持.ppt文件。

python-pptx 不是一个内置模块,所以在使用前要先通过代码
pip install python-pptx 在终端上进行安装。

如果在自己电脑上安装不上或安装缓慢,可在命令后添加
pip install python-pptx -i https://pypi.tuna.tsinghua.edu.cn/simple/
进行加速。

安装完成后,下一步就是导入这个模块;

我们只需要使用 python-pptx 模块中的 Presentation 类,这里要用到 from...import...

需要注意的是,这里是 from pptx import Presentation,而不是
from python-pptx import Presentation。

# 使用from...import从pptx模块中导入Presentation
from pptx import Presentation

2. ppt的基本操作:

由于 PPT 有多级结构,想要得到所有的文字内容,那就要从头开始层层读取。

第一步,读取文件;
第二步,读取指定幻灯片页;
第三步,读取指定形状;
第四步,读取文本框内的文本内容。


1️⃣调用 Presentation() 函数,读取指定路径,相当于打开了一份 .pptx 文件,并返回一个 Presentation 对象。

from pptx import Presentation
path = "/Users/shop.pptx"
pptxFile = Presentation(path)
print(pptxFile)

本例中,将 .pptx 文件的绝对路径以字符串格式赋值给变量 path,再将变量 path 作为参数传入 Presentation() 函数中。


2️⃣读取 .pptx 文件后,我们可以访问 Presentation 中的 .slides 属性,获取幻灯片页序列。

slide = pptxFile.slides

幻灯片页序列中包含所有幻灯片页对象,可以使用索引定位到单个幻灯片页对象;

  1. 获取PPT第一张幻灯片页对象:
slide = pptxFile.slides[0]
  1. 也可以使用 for 循环读取所有幻灯片页对象。
# for循环遍历pptxFile中.slides属性,并赋值给slide
for slide in pptxFile.slides:
    # print()输出slide
    print(slide)

使用 for 循环遍历 Presentation 对象中 .slides 属性,并赋值给变量 slide,这样就可以读取到 .pptx 文件中每个幻灯片页对象。


3️⃣在获取了全部幻灯片页对象后,接下来就要读取其中的形状。

我们可以访问幻灯片页对象中的 .shapes 属性,获取形状序列。

案例中的代码,只读取了第一页幻灯片中的所有形状。

slide = pptxFile.slides[0]
shape = slide.shapes

由于形状包含在幻灯片页中,在这里我们需要使用嵌套循环,读取每一页幻灯片中的每一个形状。

# for循环遍历pptxFile中.slides属性,并赋值给slide
for slide in pptxFile.slides:
    # for循环遍历slide中.shapes属性,赋值给变量shape
    for shape in slide.shapes:
        # print()输出shape
        print(shape)

4️⃣我们通过代码读取到每个幻灯片页中的每一个形状,接下来要获取其中的文本框。

思考一下,是不是每个形状中都有文本框呢?
在这里插入图片描述
哈哈!并不是哒哒哒哒哒哒哒哒哒哒哒哒dadadada!!!

在这里插入图片描述

形状可以按照是否含有文本分为两类,一类是含有文本框的形状,另一类是纯图片的形状。

所以,我们要将纯图片的形状排除,再从文本框中提取文字内容。

这段代码可以判断形状内是否有文本框,然后读取文本框对象。

if shape.has_text_frame == True:
    texts = shape.text_frame

访问形状对象中的 .has_text_frame 属性,判断形状中是否存在文本框,返回布尔数。

与 if 语句相结合,如果形状中存在文本框,就执行接下来的操作。


5️⃣在获取了文本框对象后,要读取文本框内的文本内容,需要通过 .text 属性访问。

访问形状中的 .text_frame 属性,获得文本框对象。

  # print()输出textFrame.text
            print(textFrame.text)

终于把 .pptx 文件中的文本内容提取出来了,不错不错🎉


6️⃣接下来,就应该把文本内容全部写入 Word 文档中。

在这里,我们需要知道一个小规则,就是写入 Word 文档的内容样式要保持一致。

也就是说,一段文本内容为一个样式块,就可以写入 Word 文档。如果一段文本内容包含多个样式块,写入 Word 文档时,就可能发生报错。

由于我们以文本框为单位提取文本内容,文本框内有段落,段落中含有不同的样式块,就这样写入 Word 文档,程序会报错。

在这里,要以样式块为最小单位提取文本内容,再把每个样式块写入 Word 文档中。

刚才我们获取了文本框对象,再往下一层读取,需要访问 .paragraphs 属性,返回文本框中的段落序列。

案例中的代码,读取了第一页幻灯片第一个文本框中的所有段落。

textFrame = shape.text_frame
paragraphs = textFrame.paragraphs

要获取每个文本框内的每个段落,就需要使用 for 循环遍历文本框的 .paragraphs 属性。

 # for循环遍历slide中.shapes属性,赋值给变量shape
    for shape in slide.shapes:
        # 判断形状中是否有文本框
        if shape.has_text_frame == True:
            # 读取形状中的文本框,并赋值给变量textFrame
            textFrame = shape.text_frame
        
            # for循环遍历文本框内的所有段落
            # 赋值给变量paragraph
            for paragraph in textFrame.paragraphs:
                # print()输出paragraph
                print(paragraph)

7️⃣获取了所有段落对象后,接下来就访问段落对象的 .runs 属性,就可以获得段落中的样式块序列。

在案例中,读取了第一页幻灯片第一个文本框第一个段落中的所有样式块。

from pptx import Presentation

path = "/Users/shop.pptx"
pptxFile = Presentation(path)

slide = pptxFile.slides[0]
shape = slide.shapes[0]
textFrame = shape.text_frame
paragraph = textFrame.paragraphs[0]

runs = paragraph.runs

接下来,for 循环遍历段落的 .runs 属性,赋值给变量 run;访问段落对象的 .runs 属性,就可以获得段落中的样式块序列。


8️⃣使用 .text 属性读取出样式块对象的文本内容。

  # for循环遍历段落中的所有样式块
                # 赋值给变量run
                for run in paragraph.runs:
                    # 读取样式块中的文本内容,并赋值给变量texts
                    texts = run.text
                    # print()输出texts
                    print(texts)

太好了,终于通过层层读取,获得了每个样式块中的文本内容<( ̄︶ ̄)>
在这里插入图片描述


三、总结:

今天我们通过读取样式块,访问其 .text 属性,获得了以样式块为单位的文本内容。

这不是提取 .pptx 文件中的文本内容的唯一方式,我们要根据不同的需求采取不同的操作。

层层读取 .pptx 文件需要嵌套循环,理清楚 PPT 的结构,就可以避免出 bug 啦~

小提示:复数结尾的属性,例如 .slides,获取的都是序列,我们可以通过索引和遍历,得到单个对象。

在这里插入图片描述


四、 完整源码:

# 使用from...import从pptx模块中导入Presentation
from pptx import Presentation

# 将.pptx文件路径赋值给变量path
path = "/Users/xiaohe/statistics.pptx"

# 读取path并赋值给变量pptxFile
pptxFile = Presentation(path)

# for循环遍历pptxFile中的.slides属性,赋值给slide
for slide in pptxFile.slides:

    # for循环遍历slide中.shapes属性,赋值给变量shape
    for shape in slide.shapes:
        # TODO 判断形状中是否有文本框
        if shape.has_text_frame==True:
            # TODO 读取形状中的文本框,并赋值给变量textFrame
            textFrame=shape.text_frame
            
        
            # TODO for循环遍历文本框内的所有段落
            # 赋值给变量paragraph
            for paragraph in textFrame.paragraphs:
                
            
                # TODO for循环遍历段落中的所有样式块
                # 赋值给变量run
                for run in paragraph.runs:
                    # TODO 读取样式块中的文本内容,并赋值给变量texts
                    texts=run.text
                    print(texts)
                    # TODO print()输出texts
                    

呜呜~ 本周就这样了,最近没时间写了~ ~ ~😢😢😢
在这里插入图片描述

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

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

相关文章

Blender 学习笔记(二)之坐标

文章目录 归零世界坐标系与局部坐标系物体的编辑模式万向坐标系视图坐标轴游标坐标轴原点变换轴心点 归零 alt G 键 世界坐标系与局部坐标系 在blender 中的物体&#xff0c;默认情况下是世界坐标系&#xff0c;也就是全局坐标系 当你按G 键&#xff0c;再按一次x 键时&…

周赛364(模拟+贪心,枚举,单调栈+前后缀分解,枚举+DFS)

文章目录 周赛364[8048. 最大二进制奇数](https://leetcode.cn/problems/maximum-odd-binary-number/)贪心 模拟 [100049. 美丽塔 I](https://leetcode.cn/problems/beautiful-towers-i/)枚举 [100048. 美丽塔 II](https://leetcode.cn/problems/beautiful-towers-ii/)单调栈 …

数据结构与算法——16.二叉树

这篇文章我们来讲一下二叉树 目录 1.概述 2.代码实现 1.概述 树&#xff1a;&#xff08;Tree&#xff09;是计算机数据存储的一种结构&#xff0c;因为存储类型和现实生活中的树类似所以被称为树。 树的源头被称为根&#xff0c;树其余分叉点被称为节点&#xff0c;而树这…

未知非参数需求和有限价格变动的动态定价

英文题目&#xff1a;Dynamic Pricing with Unknown Non-Parametric Demand and Limited Price Changes 中文题目&#xff1a;未知非参数需求和有限价格变动的动态定价 单位&#xff1a;麻省理工学院&#xff0c;剑桥 时间&#xff1a;2019 论文链接&#xff1a;https://do…

制作频谱灯

最近研究了下傅里叶变换&#xff0c;用它可以通过采集声音信号由时域转换到频域内&#xff0c;从而得到声音的频谱信息&#xff0c;可以做个频谱灯。 主要使用ESP32来实现了他&#xff0c;实现效果如下&#xff1a; 频谱灯 为了可以带出去露营&#xff0c;我把它做的很大&…

ubuntu20.04下源码编译colmap

由于稠密重建需要CUDA&#xff0c;因此先安装CUDA&#xff0c;我使用的是3050GPU&#xff0c;nvidia-smi显示最高支持CUDA11.4。 不要用sudo apt安装&#xff0c;版本较低&#xff0c;30系显卡建议安装CUDA11.0以上&#xff0c;这里安装了11.1版本。 下载&#xff1a; cuda_1…

C语言之内存函数篇(3)

目录 memcpy memcpy的使用 memcpy的模拟实现 NO1. NO2. memcpy可否实现重叠空间的拷贝 my_memcpy memcpy memmove memmove memmove 分析 代码 memset memset的使用 memcmp memcmp的使用 <0 0 >0 今天我们继续介绍几个重要的内存操作函数。&…

js中的数据结构:栈,队列,链表,字典哈希表,树

栈&#xff1a;先进后出 队列&#xff1a;先进先出 链表&#xff1a; 单链表&#xff1a; 双链表&#xff1a; 环形链表&#xff1a;最后一个数据的next指针不是指向null&#xff0c;指向的是任意之间的一个数据&#xff0c;形成一个环 数组和链表的区别&#xff1a; 字典和哈…

FPGA的汽车尾灯控制Verilog

名称&#xff1a;汽车尾灯控制Verilog 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 设计一个汽车尾灯控制器。假设汽车尾部各有2个指示灯&#xff08;LED&#xff09;&#xff0c;分别代表转弯、刹车&#xff0c;控制器功能包括&#xff1a; &…

微信收款码费率0.38太坑了

作为一个有多年运营经验的商家&#xff0c;我本人在申请收款功能时曾经走过了不少弯路。我找遍了市面上的知名的支付公司&#xff0c;但了解到的收款手续费率通常都在0.6左右&#xff0c;最低也只能降到0.38。这个过程吃过不少苦头。毕竟&#xff0c;收款功能是我们商家的命脉&…

有什么好用的设备管理软件?智慧巡检对后勤运维有什么帮助?

定期巡检在设备管理、后勤管理和运维管理中扮演着不可或缺的角色&#xff0c;以及及时发现异常并控制风险。然而&#xff0c;传统巡检工作存在弊端。为了解决这些问题&#xff0c;“的修”报修系统对巡检管理功能进行了突破性的设计和开发。   “的修”报修巡检管理功能包含了…

C++之内部类实现总结(二百三十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

vscode终端中打不开conda虚拟包管理

今天&#xff0c;想着将之前鸽的Unet网络模型给实现一下&#xff0c;结果发现&#xff0c;在vscode中运行python脚本&#xff0c;显示没有这包&#xff0c;没有那包。但是在其他的ipynb中是有的&#xff0c;感觉很奇怪。我检查了一下python版本&#xff0c;发现不是我深度学习的…

转载 - 洞察问题本质,解决工作难题

作者&#xff1a;关苏哲 高效管理者的三大技能 问题界定的6个问题 1.你所需要解决的问题是什么&#xff1f; 2.你为什么需要解决这个问题&#xff1f; 3.你期待的理想结果是什么&#xff1f; 4.这个问题包括哪些子问题&#xff1f; 5.你曾经尝试过哪些解决方式&#xff1f…

Intel架构的基本知识

字节序 字节序根据存储的方向不同, 分为大端字节序(big-endian) 和 小端字节序(little-endian) 大端字节序(big-endian): 低字节存储在起始地址 小端字节序(little-endian): 高字节存储在起始地址 获得当前主机字节序 #include <iostream>using namespace std;int ma…

LabVIEW崩溃后所产生的错误日志文件的位置

LabVIEW崩溃后所产生的错误日志文件的位置 LabVIEW开发环境刚刚崩溃&#xff0c;请问我如何访问崩溃后自动生成的日志文件&#xff1f; LabVIEW崩溃后产生的转储文件位于何处&#xff1f; 代码导致了LabVIEW崩溃&#xff0c;请问哪些文件可以帮助NI技术支持了解具体原因&…

如何做到人声和背景音乐分离?简单粗暴,赶紧学起来~

在这个短视频盛行的时代&#xff0c;优质的背景音乐会让视频锦上添花&#xff0c;但也会造成类似的问题&#xff1a;想单独使用视频中的某一段人声&#xff0c;但会被背景音乐扰乱视听效果。这时就需要将人声和背景音乐进行分离了&#xff0c;今天就来教大家如何将人声和背景音…

最新文档:微信、企业号+地理位置定位+地图展示

概述 公司有需求&#xff0c;通过企业号打卡项目&#xff0c;需要用到企业微信定位 详细 前言 demo是基于微信、企业号平台的一个定位&#xff0c;地图展示项目 后台使用springboot架构搭建的与微信交互的服务&#xff0c;使用httpclient连接池&#xff0c;调用微信接口&…

小黑子—MyBatis:第二章

MyBatis入门2.0 四 小黑子诉说Mybatis核心配置文件详情4.1 多环境4.2 Mybatis的事务管理器 - transactionManager4.3 dataSource&#xff08;数据源&#xff09;4.3.1 不同类型下的数据源有不同的属性4.3.2 pool 和 unpooled 的区别4.3.3 配置具体的数据库连接池对象 4.4 prope…

【操作系统笔记三】内存寻址

物理寻址 主存&#xff08;内存&#xff09; 计算机主存也可以称为物理内存&#xff0c;内存可以看成由若干个连续字节大小的单元组成的数组每个字节都有一个唯一的物理地址&#xff08;Physical Address&#xff09;CPU访问内存前&#xff0c;先拿到内存地址&#xff0c;然后…