python识别ppt文件格式 ——(专栏:基于python编写简单office阅卷程序③)

本文介绍了使用Python的pptx库识别PPT文件格式,通过将.pptx转换为.xml,读取标签来补充识别内容。文章详细讲解了转换过程、openpyxl库的应用,以及如何通过xml文件识别幻灯片切换方式。
摘要由CSDN通过智能技术生成

● 研二在读学生,非工科非计算机专业,故代码简陋初级勿喷,本文仅为记录和快乐分享。
○ 感谢肯定,感谢点赞收藏分享,转载请注明本页出处即可。 ____Ⓙ即刻@王昭没有君

在这里插入图片描述

本文仅为笔者摸索总结-欢迎订正补充交流讨论-

❤python识别ppt文件格式 ——(专栏:基于python编写简单office阅卷程序③)

————————

一、整体思路:

🍒1. 使用python第三方库pptx识别尽可能多的excel格式;(更简单方便)

  • 使用 dir() 查看当级存在的属性或下级对象(不含双下划线__的)
  • 使用 (.属性)试图调用查看属性,或(.对象)进入下级对象

🍒2. 将.pptx转为.xml格式文件,读取标签,补充识别pptx库无法识别的格式;

  • 解压ppt.pptx文件为xml文件(不止一个,有好几个文件夹)
  • 找到相应的属性在xml文件中的存储标签名和层级
  • 使用(层级.tag)(层级.attrib)(层级.text) 试图取出该属性

🍒3. office有个懒惰且简洁的规则是,很多默认属性和格式,若该文档中作者未修改默认格式或属性,则在xml文件中该属性或格式的标签不存在 ,则在用python抽取该格式或属性时,返回值为None或空,有时还会提示不存在而报错。例如:

  • 默认字体为等线(有的版本是宋体)
  • 默认字号28磅(也可能因版本不同而差异)
  • 默认无主题背景等
    而在修改了这些格式后,该属性标签会存储在.pptx和.xml文件中。又不像是完全的日志文件。

————————

二、使用python库情况

此处均为笔者编写阅卷程序用到的,若只识别ppt格式,并不需要以下全部:

import xlrd										# 读取excel文件,主要是获取名单和创建地址用
import openpyxl									# 登成绩进excel用
import os										# 使用文件路径等
import xml.etree.ElementTree as ET				# 读取xml文件
import pptx										# 读取ppt文件

除此之外,在解压转为xml文件时还用到以下库:

import os										# 因笔者分开写的解压程序,解压也用到os库
import xlrd										# 因笔者分开写的解压程序,解压也用到xlrd库,主要是获取名单和创建地址用
import shutil									# 删除配置文件
import zipfile
# 解压word(.docx)、excel(.xlsx)、ppt(.pptx)文件成为.xml格式文件

————————

三、openpyxl库识别表格文件结构:

  • [ ]pptx:
    • [ ]slides[序号]:
      • shapes[序号]:
        • text_frame:
          • paragraphs[序号]
            • runs[序号]
        • charts
        • tables

🍍1.读取ppt文件:pptx.Presentation ( ’ 文件地址 ’ )

ppt_file = pptx.Presentation(r"F:\测试\ppt.pptx")

(1)使用 dir(ppt_file) 查看当级存在的属性或下级对象(不含双下划线__的);

🍍2.读取幻灯片:ppt_file.slides[序号]

ppt_1 = ppt_file.slides[0] 								# 第一张幻灯片

(1)使用 dir(ppt_1) 查看当级存在的属性或下级对象(不含双下划线__的);
(2)有关幻灯片的属性基本都在slides部分里;
(3)slides部分属性包括但不仅限于:

 - 幻灯片总张数 :len(self.pptx.slides)    				#后不加[序号]
 - 幻灯片版式 :ppt_1.slide_layout.name
 - 幻灯片中形状:ppt_1.shapes[序号]
 - 母版属性貌似是ppt_1.slide_layout.name? 没调出来

🍍3.读取形状内容:ppt_1.shapes[序号]

shape_1 = ppt_1.shapes[0]									# 第一个形状

(1)使用 dir(shape_1) 查看当级存在的属性或下级对象(不含双下划线__的);

(2)shapes部分属性包括但不仅限于:

 - 形状类型 :shape_1.shape_type   								#

————①如果shape_1是一个文本框、艺术字等纯文字形状:

 - 形状全部文字内容 :shape_1.text_frame.text   					# 此处 .text_frame 可省略 
 - 段落文字内容 :shape_1.text_frame.paragraphs[序号].text
 - 段落文字对齐方式 :shape_1.text_frame.paragraphs[序号].text.alignment
 - 段落段前间距 :shape_1.text_frame.paragraphs[序号].text.alignment.space_before
 - 段落段后间距 :shape_1.text_frame.paragraphs[序号].text.alignment.space_after
 - 段落文字字体:shape_1.text_frame.paragraphs[序号].font.name
 - 段落文字字号:shape_1.text_frame.paragraphs[序号].font.size
 - 段落文字加粗:shape_1.text_frame.paragraphs[序号].font.bold 	# 布尔型

————②如果shape_1是一个图表形状:

 - 图表标题 :shape_1.name	
 - 图表宽度 :shape_1.width
 - 图表高度 :shape_1.height
 - 图标系列总数量 :len(shape_1.chart.series)
 - 图表系列数据值 :shape_1.chart.series[序号].values
 - 图表系列名 :shape_1.chart.series[序号].name
 - 图表标记点大小 :shape_1.chart.series[序号].marker.size
 - 图表标记点类型 :shape_1.chart.series[序号].marker.style
 - 图表系列数据值 :shape_1.chart.series[序号].values

————②如果shape_1是一个表格形状:

 - 表格行数 :len(shape_1.table.rows)
 - 表格列数 :len(shape_1.table.columns)
 - 表格行高 :shape_1.table.rows[序号].height
 - 表格列宽 :shape_1.table.columns[序号].width
 - 表格内容 :shape_1.table.cell(行,列).text
 - 表格填充类型 :shape_1.table.cell(0,0).fill.type
 - 表格主题色 :shape_1.table.cell(0,0).fill.theme_color
 - 表格前景色 :shape_1.table.cell(0,0).fill.fore_color

pptx库里能识别到的格式并不完整,本文有提到可识别的部分格式,其余多数还是只能通过读取xml文件调取。虽然xml文件可以识别到全部格式,但使用pptx库读取更加简便,所以能不用xml就尽量不用。
然而库功能并不完全,此时需要读取.pptx文件转成的.xml文件,识别其中格式。其中最常用的格式是幻灯片切换方式。本文以识别切换方式为例。


————————

四、读取xml文件识别文档结构:

🍋1.文件转换

(1)最直接的方法:手工将ppt.pptx文件重命名为ppt.zip文件,再解压缩。
①原文件
在这里插入图片描述

②是
在这里插入图片描述
③解压到当前文件夹,或你选择的地方
在这里插入图片描述

④我们需要使用到的xml文件都在解压后的ppt文件夹里
在这里插入图片描述

⑤根据文件的不同,里面的xml文件数量和内容均有差异。例如笔者这个文档有图表,故该文件夹下才有charts文件夹及里面的文件。若无图表且无修改图表历史记录,则该文件夹下不含charts文件夹及里面的文件。用记事本可以简单地打开查看内容。
在这里插入图片描述

(2)使用代码批量转换。在CSDN上有很多代码分享,可自行查阅ppt转xml文件等关键字。此处贴笔者使用的代码,尴尬的是笔者找不到原出处了,若原作者看见本文请联系笔者填写出处或删除本部分,非常抱歉。

  • 因笔者将试卷文件夹设置为学生学号,每个学号的文件夹里有三个需要读取的文件,故先读取名单中学号,以学号作为试卷地址路径的一部分,批量每个学号解压文件夹里的三个文件。
import os
import zipfile
import shutil
import xlrd

class Name_list():
    def __init__(self, file_address):
        self.file_address = file_address
    pass

    def read(self, sheet_name):
        workbook = xlrd.open_workbook(self.file_address)</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值